Americas Barometer
Americas Main
load(americas_url)
americas_ <- americas %>%
mutate(cntry = to_label(pais)) %>%
select(
cntry, ocup4a, ed, q10new, q1, q2,
b10a, b13, b18, b21a, n3, year
) %>%
rename(
work = ocup4a,
educ = ed,
income = q10new,
sex = q1,
age = q2,
trust_courts = b10a,
trust_parliament = b13,
trust_police = b18,
trust_gov = b21a,
demtoday = n3
) %>%
mutate(
sex = sex - 1, # sex variable erstellen
work = Recode(
work,
"2 = 1;
3 = 1;
4 = 0;
5 = 0;
6 = 0;
7 = 0"
)
) %>%
mutate_at(
vars(
income, demtoday, educ,
trust_gov, trust_parliament,
trust_police, trust_courts
),
range01
)
americas_
Bolivia
load(bolivia_url)
bolivia_ <- bolivia %>%
mutate(cntry = to_label(pais)) %>%
select(
cntry, ocup4a, ed, q10new, q1, q2,
b10a, b13, b18, b21a, n3, year
) %>%
rename(
work = ocup4a,
educ = ed,
income = q10new,
sex = q1,
age = q2,
trust_courts = b10a,
trust_parliament = b13,
trust_police = b18,
trust_gov = b21a, # viele missing values
demtoday = n3
) %>%
mutate(
sex = sex - 1, # sex variable erstellen
work = Recode(
work,
"2 = 1;
3 = 1;
4 = 0;
5 = 0;
6 = 0;
7 = 0"
)
) %>%
mutate_at(
vars(
income, demtoday, educ,
trust_gov, trust_parliament,
trust_police, trust_courts
),
range01
)
Canada
load(canada_url)
canada_ <- canada %>%
mutate(cntry = to_label(pais)) %>%
select(
cntry, exc13, education, q10, q1, q2,
b10a, b13, b18, b21a, n3, year
) %>%
rename(
work = exc13,
educ = education,
income = q10,
sex = q1,
age = q2,
trust_courts = b10a,
trust_parliament = b13,
trust_police = b18,
trust_gov = b21a,
demtoday = n3
) %>%
mutate(
sex = sex - 1, # sex variable erstellen
work = work - 1,
income = ifelse(income == 88, NA, income)
) %>%
mutate_at(
vars(
income, demtoday, educ,
trust_gov, trust_parliament,
trust_police, trust_courts
),
range01
)
Merging the Data
americas <- americas_ %>% dplyr::select(
cntry, year, educ, income,
sex, age, work, demtoday,
trust_gov, trust_parliament,
trust_police, trust_courts
)
bolivia <- bolivia_ %>% dplyr::select(
cntry, year, educ, income,
sex, age, work, demtoday,
trust_gov, trust_parliament,
trust_police, trust_courts
)
canada <- canada_ %>% dplyr::select(
cntry, year, educ, income,
sex, age, work, demtoday,
trust_gov, trust_parliament,
trust_police, trust_courts
)
americas <- rbind(americas, bolivia, canada)
americas
Asian Barometer
load(asian_raw_url)
delete_na_asian <- function(x) {
x <- Recode(
x,
"-2 = NA;
7 = NA;
8 = NA;
9 = NA;
97 = NA;
98 = NA;
99 = NA;
-1 = NA"
)
return(x)
} # Funktion um die NAs im asian Datensatz zu bestimmen
asian_3 <- asian_raw %>%
rename(
educ = se5,
trust_gov = q9,
trust_parliament = q11,
trust_police = q14,
trust_courts = q8,
sex = se2,
income = se13a,
work = se9
) %>%
mutate_at(
vars(
income, trust_gov, trust_parliament,
trust_police, trust_courts, work, sex
),
delete_na_asian
) %>% # NAs deleten
mutate(
trust_gov = 5 - trust_gov,
trust_parliament = 5 - trust_parliament,
trust_police = 5 - trust_police,
trust_courts = 5 - trust_courts,
sex = sex - 1, # sex (0/1) codieren
income = Recode(
income,
"0 = NA"
),
income = 5 - income,
work = Recode(
work, # work (0/1) codieren
"2 = 0"
),
age = Recode(
se3a, # missing values l?schen
"-1 = NA"
),
demtoday = Recode(
q91,
"-1 = NA;
97 = NA;
98 = NA;
99 = NA"
),
educ = Recode(
educ,
"-1 = NA;
98 = NA;
99 = NA"
),
cntry = to_label(country),
year = as.numeric(format(ir9, "%Y"))
) %>%
select(
cntry, year, age, sex, income, educ, work, demtoday, trust_gov, trust_parliament,
trust_police, trust_courts
) %>%
# mutate_at(vars(income, demtoday, educ, age,
# trust_gov, trust_parliament,
# trust_police, trust_courts),
# as.character) %>%
# mutate_at(vars(income, demtoday, educ, age,
# trust_gov, trust_parliament,
# trust_police, trust_courts),
# as.numeric) %>%
mutate_at(
vars(
income, demtoday, educ,
trust_gov, trust_parliament,
trust_police, trust_courts
),
range01
)
asian_3
Wave 4
load(myanmar_raw_url)
needed <- function(data) {
ss <- data %>%
rename(
educ = se5,
trust_gov = q9,
trust_parliament = q11,
trust_police = q14,
trust_courts = q8,
sex = se2,
income = se13a,
work = se9
) %>%
mutate_at(
vars(
income, trust_gov, trust_parliament,
trust_police, trust_courts, work, sex
),
delete_na_asian
) %>% # NAs deleten
mutate(
trust_gov = 5 - trust_gov,
trust_parliament = 5 - trust_parliament,
trust_police = 5 - trust_police,
trust_courts = 5 - trust_courts,
sex = sex - 1, # sex (0/1) codieren
income = Recode(
income,
"0 = NA"
),
work = Recode(
work, # work (0/1) codieren
"2 = 0"
),
age = Recode(
se3_2, # missing values l?schen
"-1 = NA"
),
demtoday = Recode(
q94,
"-1 = NA;
97 = NA;
98 = NA;
99 = NA"
),
educ = Recode(
educ,
"-1 = NA;
98 = NA;
99 = NA"
),
cntry = to_label(country),
year = year
) %>%
select(
cntry, year, age, sex, income, educ, work, demtoday,
trust_gov, trust_parliament, trust_police, trust_courts
) %>%
# mutate_at(vars(income, demtoday, educ, age,
# trust_gov, trust_parliament,
# trust_police, trust_courts),
# as.character) %>%
# mutate_at(vars(income, demtoday, educ, age,
# trust_gov, trust_parliament,
# trust_police, trust_courts),
# as.numeric) %>%
mutate_at(
vars(
income, demtoday, educ,
trust_gov, trust_parliament,
trust_police, trust_courts
),
range01
)
return(ss)
}
myanmar <- needed(myanmar_raw)
load(philip_raw_url)
load(taiwan_raw_url)
load(thai_raw_url)
load(malay_raw_url)
load(singapore_raw_url)
load(sk_raw_url)
load(cambodia_raw_url)
philip <- needed(philip_raw)
taiwan <- needed(taiwan_raw)
no non-missing arguments to max; returning -Infno non-missing arguments to min; returning Inf
thai <- needed(thai_raw)
malay <- needed(malay_raw)
singapore <- needed(singapore_raw) # Singapore hat extrem viele Missing values
sk <- needed(sk_raw)
cambodia <- needed(cambodia_raw)
asian <- rbind(
asian_3, myanmar, cambodia, sk, singapore, malay, thai, taiwan, philip,
cambodia, mongolia
Merging Everything
afro %<>%
mutate(survey = rep("afro", nrow(afro))) %>%
mutate(cntry = countrycode(cntry, "country.name.en", "country.name.en"))
latino %<>%
mutate(survey = rep("latino", nrow(latino))) %>%
mutate(cntry = countrycode(cntry, "country.name.en", "country.name.en"))
americas %<>%
mutate(survey = rep("americas", nrow(americas))) %>%
mutate(cntry = countrycode(cntry, "country.name.en", "country.name.en"))
Some values were not matched unambiguously: Hait攼㹤
wvs %<>%
mutate(survey = rep("wvs", nrow(wvs))) %>%
mutate(cntry = countrycode(cntry, "country.name.en", "country.name.en"))
ESS %<>%
mutate(survey = rep("ESS", nrow(ESS))) %>%
unique(ESS$cntry)
[1] "Albania" "Belgium"
[3] "Bulgaria" "Switzerland"
[5] "Cyprus" "Czech Republic"
[7] "Germany" "Denmark"
[9] "Estonia" "Spain"
[11] "Finland" "France"
[13] "United Kingdom of Great Britain and Northern Ireland" "Hungary"
[15] "Ireland" "Israel"
[17] "Iceland" "Italy"
[19] "Lithuania" "Netherlands"
[21] "Norway" "Poland"
[23] "Portugal" "Russian Federation"
[25] "Sweden" "Slovenia"
[27] "Slovakia" "Ukraine"
[29] "Kosovo"
unique(asian$cntry)
[1] "Japan" "Hong Kong" "Republic of Korea"
[4] "China" "Mongolia" "Philippines"
[7] "Taiwan, Province of China" "Thailand" "Indonesia"
[10] "Singapore" "Viet Nam" "Cambodia"
[13] "Malaysia" "Myanmar"
unique(wvs$cntry)
[1] "Algeria" "Argentina" "Armenia"
[4] "Australia" "Azerbaijan" "Bahrain"
[7] "Belarus" "Brazil" "Colombia"
[10] "Cyprus" "Chile" "China"
[13] "Ecuador" "Egypt" "Estonia"
[16] "Georgia" "Germany" "Ghana"
[19] "Hong Kong" "India" "Iraq"
[22] "Japan" "Jordan" "Kazakhstan"
[25] "Kuwait" "Kyrgyzstan" "Lebanon"
[28] "Libya" "Malaysia" "Mexico"
[31] "Morocco" "Netherlands" "New Zealand"
[34] "Nigeria" "Pakistan" "Palestine, State of"
[37] "Peru" "Philippines" "Poland"
[40] "Qatar" "Romania" "Russian Federation"
[43] "Rwanda" "Singapore" "Slovenia"
[46] "Republic of Korea" "South Africa" "Spain"
[49] "Sweden" "Taiwan, Province of China" "Thailand"
[52] "Trinidad and Tobago" "Tunisia" "Turkey"
[55] "Ukraine" "United States of America" "Uruguay"
[58] "Uzbekistan" "Yemen" "Zimbabwe"
unique(latino$cntry)
[1] "Argentina" "Bolivia (Plurinational State of)" "Brazil"
[4] "Colombia" "Costa Rica" "Chile"
[7] "Ecuador" "El Salvador" "Spain"
[10] "Guatemala" "Honduras" "Mexico"
[13] "Nicaragua" "Panama" "Paraguay"
[16] "Peru" "Dominican Republic" "Uruguay"
[19] "Venezuela, Bolivarian Republic of"
unique(americas$cntry)
[1] "Bahamas" "Barbados" "Belize"
[4] "Brazil" "Colombia" "Costa Rica"
[7] "Dominican Republic" "Ecuador" "El Salvador"
[10] "Guatemala" "Guyana" NA
[13] "Honduras" "Jamaica" "Mexico"
[16] "Nicaragua" "Panama" "Paraguay"
[19] "Peru" "Suriname" "Trinidad and Tobago"
[22] "Uruguay" "Bolivia (Plurinational State of)" "Canada"
unique(afro$cntry)
[1] "Algeria" "Burundi" "Benin"
[4] "Burkina Faso" "Botswana" "Cameroon"
[7] "Côte D'Ivoire" "Cabo Verde" "Egypt"
[10] "Ghana" "Guinea" "Kenya"
[13] "Lesotho" "Liberia" "Madagascar"
[16] "Mauritius" "Mali" "Malawi"
[19] "Mozambique" "Morocco" "Namibia"
[22] "Niger" "Nigeria" "South Africa"
[25] "Senegal" "Sierra Leone" "Sudan"
[28] "Swaziland" "United Republic of Tanzania" "Togo"
[31] "Tunisia" "Uganda" "Zambia"
[34] "Zimbabwe" "Gabon" "Sao Tome and Principe"
merged <- rbind(wvs, latino, afro, americas, asian, ESS)
merged %<>%
# create dummies
mutate(
wvs = ifelse(survey == "wvs", 1, 0),
filter(cntry != "Libya") %>% # exclude Libya 2014
filter(cntry != "Mali") %>% # exclude Mali 2012
filter(cntry != "Yemen") %>% # exclude Yemen 2012
# adding weight
merged %<>%
# select(cntry, year) %>%
# unique %>%
# View
merged
table(merged$wvs)
0 1
301009 80618
table(merged$afro)
0 1
280893 100734
table(merged$latino)
0 1
338714 42913
table(merged$americas)
0 1
311125 70502
table(merged$asian)
0 1
349440 32187
table(merged$ESS)
1
326954 54673
SEM Index
merged2 <- merged %>%
mutate(gov_trust = trust_gov + trust_parliament +
trust_police + trust_courts) %>%
filter(!is.na(gov_trust))
merged3 <- merged %>%
mutate(gov_trust = trust_gov + trust_parliament +
trust_police + trust_courts) %>%
filter(is.na(gov_trust))
svy.df <- survey::svydesign(id= ~1,
weights= ~weight,
data= merged)
model <- '# measurement model 1
gov_trust2 =~ 1*trust_gov + trust_parliament +
trust_police + trust_courts
trust_gov ~~ trust_parliament
'
merged <- merged %>%
mutate_at(vars(trust_gov, trust_parliament,
trust_police, trust_courts), as.numeric)
# cor(na.omit(data.frame(merged$trust_gov,
# merged$trust_police,
# merged$trust_courts,
# merged$trust_parliament,
# merged$demtoday)))
lavaan_model1<-cfa(model, meanstructure = T,
data = as.data.frame(merged),
estimator= "MLM")
fit_a1<-lavaan.survey(lavaan_model1,
estimator= "MLM", survey.design=svy.df)
summary(fit_a1, standardized=TRUE,fit.measures = TRUE, rsq = T)
lavaan (0.5-23.1097) converged normally after 38 iterations
Number of observations 339509
Estimator ML Robust
Minimum Function Test Statistic 4.858 2.577
Degrees of freedom 1 1
P-value (Chi-square) 0.028 0.108
Scaling correction factor 1.885
for the Satorra-Bentler correction
Model test baseline model:
Minimum Function Test Statistic 503887.369 334369.533
Degrees of freedom 6 6
P-value 0.000 0.000
User model versus baseline model:
Comparative Fit Index (CFI) 1.000 1.000
Tucker-Lewis Index (TLI) 1.000 1.000
Robust Comparative Fit Index (CFI) 1.000
Robust Tucker-Lewis Index (TLI) 1.000
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -159340.600 -159340.600
Loglikelihood unrestricted model (H1) -159338.171 -159338.171
Number of free parameters 13 13
Akaike (AIC) 318707.201 318707.201
Bayesian (BIC) 318846.759 318846.759
Sample-size adjusted Bayesian (BIC) 318805.445 318805.445
Root Mean Square Error of Approximation:
RMSEA 0.003 0.002
90 Percent Confidence Interval 0.001 0.007 0.000 0.005
P-value RMSEA <= 0.05 1.000 1.000
Robust RMSEA 0.003
90 Percent Confidence Interval 0.000 0.008
Standardized Root Mean Square Residual:
SRMR 0.000 0.000
Parameter Estimates:
Information Expected
Standard Errors Robust.sem
Latent Variables:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
gov_trust2 =~
trust_gov 1.000 0.208 0.613
trust_parlimnt 1.015 0.003 330.156 0.000 0.211 0.653
trust_police 1.099 0.004 253.511 0.000 0.228 0.700
trust_courts 1.315 0.005 247.330 0.000 0.273 0.847
Covariances:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
.trust_gov ~~
.trust_parlimnt 0.029 0.000 123.012 0.000 0.029 0.438
Intercepts:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
.trust_gov 0.484 0.001 715.884 0.000 0.484 1.428
.trust_parlimnt 0.456 0.001 703.812 0.000 0.456 1.414
.trust_police 0.536 0.001 822.959 0.000 0.536 1.644
.trust_courts 0.515 0.001 796.359 0.000 0.515 1.595
gov_trust2 0.000 0.000 0.000
Variances:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
.trust_gov 0.072 0.000 259.086 0.000 0.072 0.624
.trust_parlimnt 0.060 0.000 226.846 0.000 0.060 0.573
.trust_police 0.054 0.000 218.146 0.000 0.054 0.510
.trust_courts 0.029 0.000 107.510 0.000 0.029 0.282
gov_trust2 0.043 0.000 148.215 0.000 1.000 1.000
R-Square:
Estimate
trust_gov 0.376
trust_parlimnt 0.427
trust_police 0.490
trust_courts 0.718
merged4<-cbind(merged2, predict(fit_a1, newdata = merged2))
merged4$gov_trust2<-range01(merged4$gov_trust2)
# head(merged4)
merged<-plyr::rbind.fill(merged3,merged4)
merged$gov_trust<-merged$gov_trust2
head(merged)
Some Recoding
table(merged$cntry,merged$year)
1582 1583 2000 2010 2011 2012 2013 2014 2015 2077
Albania 0 0 0 0 0 615 586 0 0 0
Algeria 0 0 0 0 0 0 2404 0 1200 0
Argentina 0 0 0 0 0 0 2230 0 1200 0
Armenia 0 0 0 0 1100 0 0 0 0 0
Australia 0 0 0 0 0 1477 0 0 0 0
Azerbaijan 0 0 0 0 1002 0 0 0 0 0
Bahamas 0 0 0 0 0 0 0 3429 0 0
Bahrain 0 0 0 0 0 0 0 1200 0 0
Barbados 0 0 0 0 0 0 0 3828 0 0
Belarus 0 0 0 0 1535 0 0 0 0 0
Belgium 0 0 0 0 0 1869 0 0 0 0
Belize 0 0 0 0 0 1512 0 1533 0 0
Benin 0 0 0 0 1200 0 0 1200 0 0
Bolivia (Plurinational State of) 0 0 0 0 0 3029 1200 0 1200 0
Botswana 0 0 0 0 0 1200 0 1200 0 0
Brazil 0 0 0 0 0 1499 1204 2986 1250 0
Bulgaria 0 0 0 0 0 0 2260 0 0 0
Burkina Faso 0 0 0 0 0 1200 0 0 1200 0
Burundi 0 0 0 0 0 1200 0 1200 0 0
Cabo Verde 0 0 0 0 1208 0 0 1200 0 0
Cambodia 0 0 0 0 0 1200 0 0 2400 0
Cameroon 0 0 0 0 0 0 1200 0 1182 0
Canada 0 0 0 1500 0 0 0 0 0 0
Chile 0 0 0 0 1000 0 1200 0 1200 0
China 0 3 1 0 3408 2360 0 0 0 1
Colombia 0 0 0 0 0 3024 1200 1496 1200 0
Costa Rica 0 0 0 0 0 1498 1000 1537 1000 0
Côte D'Ivoire 0 0 0 0 0 0 1200 1199 0 0
Cyprus 0 0 0 0 1000 1089 27 0 0 0
Czech Republic 0 0 0 0 0 0 2009 0 0 0
Denmark 0 0 0 0 0 0 1650 0 0 0
Dominican Republic 0 0 0 0 0 1512 1000 1520 1000 0
Ecuador 0 0 0 0 0 1500 2402 0 1200 0
El Salvador 0 0 0 0 0 1497 1000 1512 1000 0
Estonia 0 0 0 0 1533 2279 101 0 0 0
Finland 0 0 0 0 0 1884 313 0 0 0
France 0 0 0 0 0 0 1968 0 0 0
Gabon 0 0 0 0 0 0 0 0 1198 0
Georgia 0 0 0 0 0 0 0 1202 0 0
Germany 0 0 0 0 0 2753 2251 0 0 0
Ghana 0 0 0 0 0 3952 0 2400 0 0
Guatemala 0 0 0 0 0 1509 1000 1506 1000 0
Guinea 0 0 0 0 0 0 1200 0 1200 0
Guyana 0 0 0 0 0 1529 0 1557 0 0
Honduras 0 0 0 0 0 1728 1000 1561 1000 0
Hong Kong 0 0 0 0 0 1207 1000 0 0 0
Hungary 0 0 0 0 0 1895 119 0 0 0
Iceland 0 0 0 0 0 601 151 0 0 0
India 0 0 0 0 0 0 0 1581 0 0
Indonesia 0 0 0 0 1550 0 0 0 0 0
Iraq 0 0 0 0 0 1200 0 0 0 0
Ireland 0 0 0 0 0 995 1633 0 0 0
Israel 0 0 0 0 0 2229 279 0 0 0
Italy 0 0 0 0 0 0 960 0 0 0
Jamaica 0 0 0 0 0 1500 0 1503 0 0
Japan 0 0 0 2443 1880 0 0 0 0 0
Jordan 0 0 0 0 0 0 0 1200 0 0
Kazakhstan 0 0 0 0 1500 0 0 0 0 0
Kenya 0 0 0 0 2399 0 0 2397 0 0
Kosovo 0 0 0 0 0 0 1295 0 0 0
Kuwait 0 0 0 0 0 0 0 1303 0 0
Kyrgyzstan 0 0 0 0 1500 0 0 0 0 0
Lebanon 0 0 0 0 0 0 1200 0 0 0
Lesotho 0 0 0 0 0 1197 0 1200 0 0
Liberia 0 0 0 0 0 1199 0 0 1199 0
Lithuania 0 0 0 0 0 0 2109 0 0 0
Madagascar 0 0 0 0 0 0 1200 1015 185 0
Malawi 0 0 0 0 0 2407 0 2400 0 0
Malaysia 0 0 0 0 1214 1300 0 1207 0 0
Mauritius 0 0 0 0 0 1200 0 1200 0 0
Mexico 0 0 0 0 0 3560 1200 1535 1200 0
Mongolia 0 0 0 1210 0 0 0 1228 0 0
Morocco 0 0 0 0 1200 0 1196 0 1200 0
Mozambique 0 0 0 0 0 2400 0 0 2400 0
Myanmar 0 0 0 0 0 0 0 0 1620 0
Namibia 0 0 0 0 0 1200 0 1200 0 0
Netherlands 0 0 0 0 0 3381 366 0 0 0
New Zealand 0 0 0 0 841 0 0 0 0 0
Nicaragua 0 0 0 0 0 1686 1000 1546 1000 0
Niger 0 0 0 0 0 0 1199 0 1200 0
Nigeria 0 0 0 0 1759 2364 36 2319 81 0
Norway 0 0 0 0 0 1446 178 0 0 0
Pakistan 0 0 0 0 0 1200 0 0 0 0
Panama 0 0 0 0 0 1620 1000 1508 1000 0
Paraguay 0 0 0 0 0 1510 1200 1503 1200 0
Peru 0 0 0 0 0 2710 1200 1500 1200 0
Philippines 0 0 0 1200 0 1200 0 1200 0 0
Poland 0 0 0 0 0 2851 13 0 0 0
Portugal 0 0 0 0 0 395 1756 0 0 0
Qatar 0 0 0 1060 0 0 0 0 0 0
Republic of Korea 0 0 0 1200 1207 0 0 0 1200 0
Romania 0 0 0 0 0 1503 0 0 0 0
Russian Federation 0 0 0 0 2500 2484 0 0 0 0
Rwanda 0 0 0 0 0 1527 0 0 0 0
Sao Tome and Principe 0 0 0 0 0 0 0 0 1196 0
Senegal 0 0 0 0 0 0 1200 1200 0 0
Sierra Leone 0 0 0 0 0 1190 0 0 1191 0
Singapore 1000 0 0 0 0 1972 0 993 46 0
Slovakia 0 0 0 0 0 1415 432 0 0 0
Slovenia 0 0 0 0 1069 1257 0 0 0 0
[ reached getOption("max.print") -- omitted 24 rows ]
table(subset(merged,merged$cntry=="China")$survey,
subset(merged,merged$cntry=="China")$year)
1583 2000 2011 2012 2077
asian 3 1 3408 60 1
wvs 0 0 0 2300 0
merged$year[merged$cntry=="China" & merged$year == 1583] <- 2011
merged$year[merged$cntry=="China" & merged$year == 2000] <- 2011
merged$year[merged$cntry=="China" & merged$year == 2077] <- 2011
merged$year[merged$cntry=="China" & merged$year == 2012] <- 2011
table(subset(merged,merged$cntry=="Singapore")$survey,
subset(merged,merged$cntry=="Singapore")$year)
1582 2012 2014 2015
asian 1000 0 993 46
wvs 0 1972 0 0
merged$year[merged$cntry=="Singapore" & merged$year == 1582] <- 2011
hist(merged$gov_trust)

Crap
compare_cntry<-data.frame(table(merged$cntry,merged$year))
compare_cntry<-tidyr::spread(compare_cntry,Var2,Freq)
compare_cntry[compare_cntry==0]<-100000
#compare_cntry<-na.omit(compare_cntry)
indie<-as.numeric(apply(compare_cntry[,-1],1,sum))
compare_cntry$double<-indie<900000
compare_cntry[compare_cntry==100000]<-0
compare_cntry2 <- subset(compare_cntry,compare_cntry$double==TRUE)
compare_cntry3 <- subset(merged,merged$cntry %in% compare_cntry2$Var1)
y1<-subset(compare_cntry3,compare_cntry3$cntry=="Belize" &
compare_cntry3$year==2012)$gov_trust
y2<-subset(compare_cntry3,compare_cntry3$cntry=="Belize" &
compare_cntry3$year==2014)$gov_trust
t.test(y1,y2)
y1<-subset(compare_cntry3,compare_cntry3$cntry=="Bolivia (Plurinational State of)" &
compare_cntry3$year==2012)$gov_trust
y2<-subset(compare_cntry3,compare_cntry3$cntry=="Bolivia (Plurinational State of)" &
compare_cntry3$year==2013)$gov_trust
t.test(y1,y2)
y1<-subset(compare_cntry3,compare_cntry3$cntry=="South Africa" &
compare_cntry3$year==2011)$gov_trust
y2<-subset(compare_cntry3,compare_cntry3$cntry=="South Africa" &
compare_cntry3$year==2013)$gov_trust
t.test(y1,y2)
subset(merged,merged$year==2012)
library(dplyr)
compare_cntry4 <- compare_cntry3 %>%
group_by(cntry,year) %>%
summarise_all(funs(mean(., na.rm=TRUE)))
compare_cntry4$cntryear<-paste(compare_cntry4$cntry,compare_cntry4$year)
as.data.frame(compare_cntry4[,c(17,8)])
?ddply
head(afro)
afrocntry<-unique(afro$cntry)
latinocntry<-unique(latino2013$cntry)
arabcntry<-unique(arab3$cntry)
wvscntry<-unique(wvs$cntry)
cntry_table<- data.frame(as.character(wvscntry),
c(as.character(arabcntry),rep("-",48)),
c(as.character(latinocntry),rep("-",41)),
c(as.character(afrocntry),rep("-",24)))
colnames(cntry_table) <- c("wvs","arab","latino","afro")
arrange(cntry_table, wvs, afro)
table(combined$politcat.x)
mplusdata <- combined %>% dplyr::select(cntry, delib10, demtoday,
trust_gov, trust_parliament,
trust_police,trust_courts,weight)
mplusdata <- na.omit(mplusdata)
mplusdata$cntry <- as.numeric(mplusdata$cntry)
write_csv(mplusdata, path = "mplusdata.csv", col_names = F)
mplusdata2 <- combined %>% dplyr::select(cntry, delib10, demtoday,
gov_trust,weight)
mplusdata2 <- na.omit(mplusdata2)
mplusdata2$cntry <- as.numeric(mplusdata2$cntry)
write_csv(mplusdata2, path = "mplusdat2a.csv", col_names = F)
mplusdata2_dem <- combined_dem %>% dplyr::select(cntry, delib10, demtoday,
gov_trust,weight)
mplusdata2_dem <- na.omit(mplusdata2_dem)
mplusdata2_dem$cntry <- as.numeric(mplusdata2_dem$cntry)
write_csv(mplusdata2_dem, path = "mplusdat2_dema.csv", col_names = F)
mplusdata2_aut <- combined_aut %>% dplyr::select(cntry, delib10, demtoday,
gov_trust,weight)
mplusdata2_aut <- na.omit(mplusdata2_aut)
mplusdata2_aut$cntry <- as.numeric(mplusdata2_aut$cntry)
write_csv(mplusdata2_aut, path = "mplusdat2_auta.csv", col_names = F)
combined <- merge(combined, physi2_s, by = "cntry")
combined_dem <- subset(combined,combined$polity_demdummy==1)
mplusdata_dem <- combined_dem %>% dplyr::select(cntry, delib10, demtoday,
trust_gov, trust_parliament,
trust_police,trust_courts,weight)
mplusdata_dem <- na.omit(mplusdata_dem)
mplusdata_dem$cntry <- as.numeric(mplusdata_dem$cntry)
write_csv(mplusdata_dem, path = "mplusdata_dem.csv", col_names = F)
combined_aut <- subset(combined,combined$polity_demdummy==0)
mplusdata_aut <- combined_aut %>% dplyr::select(cntry, delib10, demtoday,
trust_gov, trust_parliament,
trust_police,trust_courts,weight)
mplusdata_aut <- na.omit(mplusdata_aut)
mplusdata_aut$cntry <- as.numeric(mplusdata_aut$cntry)
write_csv(mplusdata_aut, path = "mplusdata_aut.csv", col_names = F)
#data_wids <- dcast(merged, cntry~year,
# value.var=c("year"))
#data_wids2 <- as.data.frame(lapply(data_wids[,-1],function(n) 0<n))
#data_wids3 <- as.data.frame(apply(data_wids2,2,as.numeric))
#data_wids3 <- cbind(data_wids[,1],data_wids3)
#names(data_wids3)[1]<-"cntry"
#table_stuff <- merge(data_wids3 ,table_stuff, by="cntry")
#table_stuff$polity10[table_stuff$cntry=="Tunisia"] <- 5.32382
#table_stuff2$polity10[table_stuff2$cntry=="Tunisia"] <- 5.32382
head(table_stuff)
cor(na.omit(data.frame(table_stuff$legit,table_stuff$legit2,table_stuff$legit3,
table_stuff$mean_gov)))
table_stuff$gni <- table_stuff$gni_c
table_stuff$gni_c[table_stuff$gni <= 1025] <- "low"
table_stuff$gni_c[table_stuff$gni > 1026 & table_stuff$gni <= 4035] <- "lower-middle"
table_stuff$gni_c[table_stuff$gni > 4036 & table_stuff$gni <= 12475] <- "upper-middle"
table_stuff$gni_c[table_stuff$gni > 12475] <- "high"
table_stuff$gni_c2 <- table_stuff$gni_c
table_stuff$gni_c2[table_stuff$gni_c == "lower-middle"] <- "low"
table_stuff$gni_c2[table_stuff$gni_c == "upper-middle"] <- "high"
table(table_stuff$gni_c)
table(table_stuff$gni_c2)
The cut-off points are HDI of less than 0.550
for low human development, 0.550-0.699 for medium human
development, 0.700-0.799 for high human development and
0.800 or greater for very high human development.
#table_stuff$hdi_c <- table_stuff$hdi
#table_stuff$hdi_c[table_stuff$hdi < 0.550] <- "low"
#table_stuff$hdi_c[table_stuff$hdi >= 0.550 & table_stuff$hdi <= 0.699] <- "medium"
#table_stuff$hdi_c[table_stuff$hdi >= 0.700 & table_stuff$hdi <= 0.899] <- "high"
#table_stuff$hdi_c[table_stuff$hdi >= 0.90] <- "very high"
#table(table_stuff$hdi_c)
table(round(table_stuff$terror))
table_stuff$mean_gov2 <- table_stuff$mean_gov
table_stuff$mean_gov2[is.na(table_stuff$mean_gov2)]<-999
table_stuff$mean_gov3 <- table_stuff$mean_gov
table_stuff$mean_gov3[is.na(table_stuff$mean_gov3)]<-999
table_stuff$mean_gov4 <- table_stuff$mean_gov
table_stuff$mean_gov4[is.na(table_stuff$mean_gov4)]<-999
table_stuff$mean_gov5 <- table_stuff$mean_gov
table_stuff$mean_gov5[is.na(table_stuff$mean_gov5)]<-999
table_stuff$mean_gov6 <- table_stuff$mean_gov
table_stuff$mean_gov6[is.na(table_stuff$mean_gov6)]<-999
table_stuff$mean_gov7 <- table_stuff$mean_gov
table_stuff$mean_gov7[is.na(table_stuff$mean_gov7)]<-999
table_stuff$mean_gov8 <- table_stuff$mean_gov
table_stuff$mean_gov8[is.na(table_stuff$mean_gov8)]<-999
table_stuff$mean_gov9 <- table_stuff$mean_gov
table_stuff$mean_gov9[is.na(table_stuff$mean_gov9)]<-999
table_stuff$physviol2 <- table_stuff$physviol
table_stuff$physviol2[is.na(table_stuff$physviol2)] <- 999
table_stuff$terror2 <- round(table_stuff$terror)
table_stuff$terror2[is.nan(table_stuff$terror2)] <- 999
table_stuff$discuss2 <- round(table_stuff$discuss*4)
table_stuff$discuss2[is.nan(table_stuff$discuss2)] <- 999
table(table_stuff$physviol)
table_stuff$mean_gov2[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4]-5
table_stuff$mean_gov2[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3]-10
table_stuff$mean_gov2[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2]-15
table_stuff$mean_gov2[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1]-20
table_stuff$mean_gov2[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0] -25
table_stuff$mean_gov2[table_stuff$mean_gov2>100] <- NA
table(table_stuff$mean_gov2)
table_stuff$mean_gov3[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4]-8
table_stuff$mean_gov3[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3]-16
table_stuff$mean_gov3[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2]-24
table_stuff$mean_gov3[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1] -32
table_stuff$mean_gov3[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0] -30
table_stuff$mean_gov3[table_stuff$mean_gov3>100] <- NA
table(table_stuff$mean_gov3)
table_stuff$mean_gov4[table_stuff$terror2==5] <- table_stuff$mean_gov4[table_stuff$terror2==5]-5
table_stuff$mean_gov4[table_stuff$terror2==4] <- table_stuff$mean_gov4[table_stuff$terror2==4]-10
table_stuff$mean_gov4[table_stuff$terror2==3] <- table_stuff$mean_gov4[table_stuff$terror2==3]-15
table_stuff$mean_gov4[table_stuff$mean_gov4>100] <- NA
table(table_stuff$mean_gov4)
table_stuff$mean_gov5[table_stuff$terror2==5] <- table_stuff$mean_gov5[table_stuff$terror2==5]-8
table_stuff$mean_gov5[table_stuff$terror2==4] <- table_stuff$mean_gov5[table_stuff$terror2==4]-16
table_stuff$mean_gov5[table_stuff$terror2==3] <- table_stuff$mean_gov5[table_stuff$terror2==3]-24
table_stuff$mean_gov5[table_stuff$mean_gov5>100] <- NA
table(table_stuff$mean_gov5)
table_stuff$mean_gov6[table_stuff$discuss2==2] <- table_stuff$mean_gov6[table_stuff$discuss2==2] -5
table_stuff$mean_gov6[table_stuff$discuss2==1] <- table_stuff$mean_gov6[table_stuff$discuss2==1] -10
table_stuff$mean_gov6[table_stuff$mean_gov6>100] <- NA
table(table_stuff$mean_gov6)
table_stuff$mean_gov7[table_stuff$discuss2==2] <- table_stuff$mean_gov7[table_stuff$discuss2==2] -10
table_stuff$mean_gov7[table_stuff$discuss2==1] <- table_stuff$mean_gov7[table_stuff$discuss2==1] -20
table_stuff$mean_gov7[table_stuff$mean_gov7>100] <- NA
table(table_stuff$mean_gov7)
load(qog_url)
qog10 <- subset(qog,qog$year==2000 |
qog$year==2001 |
qog$year==2002 |
qog$year==2003 |
qog$year==2004 |
qog$year==2005 |
qog$year==2006 |
qog$year==2007 |
qog$year==2008 |
qog$year==2009 |
qog$year==2010)
library(countrycode)
qog10$cntry<-countrycode(qog10$ccodecow, "cown","country.name.en")
qog10$al_ethnic<-as.numeric(qog10$al_ethnic)
#tidyr::gather(qog10,c("cntry","year"),"al_ethnic")
qog10a <- qog10 %>% dplyr::select(cntry,year,al_ethnic) %>%
as.data.frame()
data_wide17 <- reshape(data = qog10a,
idvar = "cntry",
v.names = "al_ethnic",
timevar = "year",
direction = "wide")
#qog10hdi <- qog10 %>% dplyr::select(cntry,year,undp_hdi) %>%
# as.data.frame()
#data_wide_hdi <- hdi
#reshape(data = qog10hdi,
# idvar = "cntry",
# v.names = "undp_hdi",
# timevar = "year",
# direction = "wide")
table(qog$al_ethnic,qog$year)
qog14 <- subset(qog,qog$year==2014)
qog14$cntry<-countrycode(qog14$ccodecow, "cown","country.name.en")
qog14 <- qog14 %>% dplyr::select(cntry,year,cspf_legit) %>%
as.data.frame()
data_wide18 <- reshape(data = qog14,
idvar = "cntry",
v.names = "cspf_legit",
timevar = "year",
direction = "wide")
qog15 <- subset(qog,qog$year==2015)
qog15$cntry<-countrycode(qog15$ccodecow, "cown","country.name.en")
qog15 <- qog15 %>% dplyr::select(cntry,year,ffp_sl) %>%
as.data.frame()
data_wide19 <- reshape(data = qog15,
idvar = "cntry",
v.names = "ffp_sl",
timevar = "year",
direction = "wide")
qog10$ciri_physint<-as.numeric(qog10$ciri_physint)
qog10a <- qog10 %>% dplyr::select(cntry,year,ciri_physint) %>%
as.data.frame()
data_wide20 <- reshape(data = qog10a,
idvar = "cntry",
v.names = "ciri_physint",
timevar = "year",
direction = "wide")
qog10$gd_ptss <-as.numeric(qog10$gd_ptss)
qog10a <- qog10 %>% dplyr::select(cntry,year,gd_ptss) %>%
as.data.frame()
data_wide21 <- reshape(data = qog10a,
idvar = "cntry",
v.names = "gd_ptss",
timevar = "year",
direction = "wide")
qog14<-subset(qog,qog$year==2014)
qog13<-subset(qog,qog$year==2013)
qog12<-subset(qog,qog$year==2012)
qog11<-subset(qog,qog$year==2011)
qog10<-subset(qog,qog$year==2010)
qog8<-subset(qog,qog$year==2008)
qog7<-subset(qog,qog$year==2007)
qog6<-subset(qog,qog$year==2006)
qog5<-subset(qog,qog$year==2005)
qog4<-subset(qog,qog$year==2004)
qog3<-subset(qog,qog$year==2003)
qog2<-subset(qog,qog$year==2002)
qog1<-subset(qog,qog$year==2001)
qog0<-subset(qog,qog$year==2000)
table(is.na(qog$wel_culture),qog$year)
culreg<- pmax(qog14$wel_culture, qog13$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog12$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog11$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog10$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog8$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog7$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog6$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog5$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog4$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog3$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog2$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog1$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog0$wel_culture, na.rm = TRUE)
culreg<- as.character(sjmisc::to_label(culreg))
culreg<-as.data.frame(cbind(culreg,qog14$ccodecow))
oreast <- subset(culreg, culreg$culreg == "Orthodox East")
oreast
#culreg<- pmax(culreg, qog10$wel_culture, na.rm = TRUE)
qog14$ht_region
culreg$cntry<-countrycode(culreg$V2, "cown","country.name.en")
tabeletto<-merge(table_stuff,culreg,by="cntry")
tabeletto<-as.data.frame(cbind(table_stuff$regions,
as.character(table_stuff$cntry),
as.character(tabeletto$culreg)))
tabeletto <- tabeletto[order(tabeletto$V1, tabeletto$V3),]
#edit(tabeletto)
culreg<-data.frame(cbind(tabeletto,culreg))
culreg<-culreg[,c(2,4)]
names(culreg)[1]<-c("cntry")
table_stuff3 <- merge(table_stuff,culreg,by="cntry")
table(as.character(tabeletto$V3))
qog100 <- subset(qog,qog$year==2010)
qog100$cntry<-countrycode(sjmisc::to_label(qog100$ccodecow), "cown","country.name.en")
qog100 <- qog100 %>% dplyr::select(cntry,year,ht_regtype1) %>%
as.data.frame()
qog100$regtype<-sjmisc::to_label(qog100$ht_regtype1)
qog100$year <- NULL
qog100$ht_regtype1 <- NULL
table(qog100$regtype)
ethnic10<-as.numeric(rowMeans(data_wide17[,2:12])) # mean over last 10 years (2000 - 2010)
physint10<-as.numeric(rowMeans(data_wide20[,2:12])) # mean over last 10 years (2000 - 2010)
terror10<-as.numeric(rowMeans(data_wide21[,2:12])) # mean over last 10 years (2000 - 2010)
legit<-as.numeric(data_wide18[,2]) # mean over last 10 years (2000 - 2010)
legit2<-as.numeric(data_wide19[,2]) # mean over last 10 years (2000 - 2010)
qogthingy<-data.frame(data_wide19[,1],ethnic10,legit,legit2,physint10,terror10)
colnames(qogthingy)[1]<-c("cntry")
qogthingy<-merge(x=qogthingy, y=qog100, by="cntry")
#qogthingy<-data.frame(data_wide17[,1],ethnic10)
#colnames(qogthingy)[1]<-c("cntry")
#combined <- merge(x=qogthingy, y=combined, by="cntry")
qog_cs <-read_spss("C:/Users/Favone/Downloads/qog_std_cs_jan17.sav") #loading dataset
qog_cs$cntry<-countrycode(qog_cs$ccodecow, "cown","country.name.en")
qog_cs$legit3<-as.numeric(qog_cs$gov_ixlegitimacyindex)
legit_dat<-data.frame(qog_cs$cntry,qog_cs$legit3)
colnames(legit_dat)<-c("cntry","legit3")
aggrdelib <- merge(x=legit_dat, y=aggrdelib, by="cntry")
aggrdelib$legit3 <- range01(aggrdelib$legit3)
cor(na.omit(aggrdelib[,c(4,5,7,13)]))
cor(na.omit(aggrdelib[,c(4,5,2,6:13)]))
aggrdelib$legit <- 1-range01(aggrdelib$legit)
aggrdelib$legit2 <- 1-range01(aggrdelib$legit2)
aggrdelib$asia <- aggrdelib$e.asia + aggrdelib$s.e.asia + aggrdelib$s.asia + aggrdelib$pacific
SFI <-read_spss("C:/Users/Favone/Downloads/SFIv2016.sav") #loading dataset
SFI <- subset(SFI,SFI$year==2015)
SFI$cntry <-countrycode(SFI$country, "country.name.en","country.name.en")
SFI$cntry[79] <- "North Korea"
SFI$cntry <-countrycode(SFI$cntry, "country.name.en","country.name.en")
SFI$legitimacy <- SFI$legit
SFI$legit <- NULL
aggrdelib <- merge(x=SFI, y=aggrdelib, by="cntry")
hdi <- read_csv("hdi.csv")
hdi$cntry<-countrycode(hdi$Country, "country.name.en","country.name.en")
hdi$'1990'<- NULL ; hdi$'1991'<- NULL ; hdi$'1992'<- NULL ; hdi$'1993'<- NULL
hdi$'1994'<- NULL; hdi$'1995'<- NULL; hdi$'1996'<- NULL; hdi$'1997'<- NULL
hdi$'1998'<- NULL ; hdi$'1999'<- NULL ; hdi$'2011'<- NULL ; hdi$'2012'<- NULL
hdi$'2013'<- NULL; hdi$'2014'<- NULL; hdi$'2015'<- NULL;hdi$`HDI Rank (2015)`<- NULL
hdi$Country<- NULL
hdi10<-as.numeric(rowMeans(hdi[,1:11]))
hdat<-data.frame(hdi$cntry,hdi10)
names(hdat)<-c("cntry","hdi10")
aggrdelib <- merge(x=hdat, y=aggrdelib, by="cntry")
#table(aggrdelib$hdi10)
#gc()
#combined <- merge(x=hdat, y=combined, by="cntry")
#colnames(aggrdelib)[9]<-"e_p_polity"
#lop<-subset(vdems_start,vdems_start$year==2010)
cor(na.omit(aggrdelib2[,2:17]))
cor(na.omit(data.frame(aggrdelib$polity10,aggrdelib$delib10)))
#hist(vdems$v2dlconslt)
#hist(vdems$v2xcl_disc)
#table(vdems_start$e_boix_regime,vdems_start$year)
#table(vdems_sub$e_p_polity,vdems_sub$year)
##### merging time ####
combined <- merge(x=merged, y=aggrdelib, by="cntry")
table(combined$cntry)
combined <- as.data.frame(combined)
combined$gov_trust <- as.numeric(combined$gov_trust)
combined$age <- as.numeric(combined$age)
combined$income <- as.numeric(combined$income)
combined$educ <- as.numeric(combined$educ)
combined$sex <- as.factor(combined$sex)
combined$authoritarian <- as.numeric(combined$authoritarian)
combined$safety <- as.numeric(combined$safety)
combined$demtoday <- as.numeric(combined$demtoday)
combined$latino <- factor(combined$latino)
combined$afro <- factor(combined$afro)
combined$americas <- factor(combined$americas)
combined$asia <- combined$e.asia + combined$s.e.asia + combined$s.asia + combined$pacific
cor(na.omit(data.frame(combined$gov_trust,combined$income,combined$educ, #Socioeconomic factors
combined$delib10, combined$polity10, combined$gdp10, combined$demtoday)))
combined$cntry<-as.factor(combined$cntry)
#combined$polity10 <- combined$polity10*20-10
#combined$regime <- combined$polity10
#combined$regime[combined$polity_autodummy==1] <- "auto"
#combined$regime[combined$polity_anodummy==1] <- "ano"
#combined$regime[combined$polity_demdummy==1] <- "demo"
hist(combined$gov_trust)
qplot(combined$gov_trust)
combined$cntry
#physi_s <- vdems_sub2 %>% dplyr::select(cntryears, franz)
#combined <- merge(combined, physi_s, by = "cntryears")
#physi2_s <- ddply(combined,~cntry,
# summarise,politcat=mean(franz,na.rm=T))
#combined <- merge(combined, physi2_s, by = "cntry")
vdems_sub2$cntryears <- paste(vdems_sub2$cntry,vdems_sub2$year)
physi <- vdems_sub2 %>% dplyr::select(cntryears, perc)
combined <- merge(combined, physi, by = "cntryears")
physi2 <- ddply(combined,~cntry,
summarise,physviol=mean(perc,na.rm=T))
combined <- merge(combined, physi2, by = "cntry")
#physi_22$dis3 <-round(physi_22$dis2)
#unique(physi2_s$cntry)
#1-2.5
#3-5
#5.5 - 7
#physi2_s$politcat2<-8-((physi2_s$politcat) * (7/10))
#11
#physi2_s$polity_demdummy <- physi2_s$politcat2
#physi2_s$polity_demdummy [physi2_s$politcat2 <= 2.5] <- 1
#physi2_s$polity_demdummy [physi2_s$politcat2 > 2.5] <- 0
#table(physi2_s$polity_demdummy)
#physi2_s$polity_anodummy <- physi2_s$politcat2
#physi2_s$polity_anodummy[physi2_s$politcat2 > 2.5 & physi2_s$politcat2 < 5.5] <- 1
#physi2_s$polity_anodummy[physi2_s$politcat2 <= 2.5 | physi2_s$politcat2 >= 5.5] <- 0
#table(physi2_s$polity_anodummy)
#physi2_s$polity_autodummy <- physi2_s$politcat2
#physi2_s$polity_autodummy[physi2_s$politcat2 >= 5.5] <- 1
#physi2_s$polity_autodummy[physi2_s$politcat2 < 5.5] <- 0
#table(physi2_s$polity_autodummy)
#physi2_s$regime <- physi2_s$politcat
#physi2_s$regime[physi2_s$polity_autodummy==1] <- "auto"
#physi2_s$regime[physi2_s$polity_anodummy==1] <- "ano"
#physi2_s$regime[physi2_s$polity_demdummy==1] <- "demo"
#unique(physi2_s$cntry)
table(physi2_s$regime)
qog2000 <- subset(qog,qog$year==2010 |
qog$year==2011 |
qog$year==2012 |
qog$year==2013 |
qog$year==2014 |
qog$year==2015)
table(qog2000$gd_ptsa,qog2000$year)
qog2000$perc2 <- qog2000$gd_ptsa
qog2000$cntry<-countrycode(qog2000$ccodecow, "cown","country.name.en")
qog2000$cntryears <- paste(qog2000$cntry,qog2000$year)
physi2000 <- qog2000 %>% dplyr::select(cntryears, perc2)
combined <- merge(combined, physi2000, by = "cntryears")
physi22000 <- ddply(combined,~cntry,
summarise,terror=mean(perc2,na.rm=T))
combined <- merge(combined, physi22000, by = "cntry")
#table(qog2000$undp_hdi,qog2000$year)
#physiff <- qog2000 %>% dplyr::select(cntryears, undp_hdi)
#combined <- merge(combined, physiff, by = "cntryears")
#physiff2 <- ddply(combined,~cntry,
# summarise,hdi=mean(undp_hdi,na.rm=T))
#combined <- merge(combined, physiff2, by = "cntry")
gni <- read_csv("GNI.csv", skip = 1)
gni$`2015`<-gsub("ttt","",gni$`2015`)
gni$`2015`<-gsub("ff","",gni$`2015`)
gni$`2015`<-gsub("sss","",gni$`2015`)
gni$`2015`<-gsub("uuu","",gni$`2015`)
gni$`2015`<-gsub("o","",gni$`2015`)
gni$`2015` <- as.numeric(gni$`2015`)
gni$`2014`<-gsub("ttt","",gni$`2014`)
gni$`2014`<-gsub("ff","",gni$`2014`)
gni$`2014`<-gsub("sss","",gni$`2014`)
gni$`2014`<-gsub("uuu","",gni$`2014`)
gni$`2014`<-gsub("o","",gni$`2014`)
gni$`2014` <- as.numeric(gni$`2014`)
gni<-gni[,c(2,23:28)]
gni<-gather(as.data.frame(gni),key = "Country")
names(gni) <- c("cntry","year","gni")
gni$cntry<-countrycode(gni$cntry,"country.name.en","country.name.en")
gni$cntryears <- paste(gni$cntry,gni$year)
physigni <- gni %>% dplyr::select(cntryears, gni)
combined <- merge(combined, physigni, by = "cntryears")
physigni2 <- ddply(combined,~cntry,
summarise,gni_c=mean(gni,na.rm=T))
combined <- merge(combined, physigni2, by = "cntry")
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIExvYWRpbmcgdGhlIFBhY2thZ2VzDQoNCmBgYHtyfQ0KbGlicmFyeShwYWNtYW4pDQoNCnBfbG9hZCh0aWR5dmVyc2UsIGhhdmVuLHNqbWlzYywNCiAgICAgICAgICAgICAgICAgICAgIGZvcmNhdHMsIHdlaWdodHMsIGNhciwNCiAgICAgICAgICAgICAgICAgICAgIGNvdW50cnljb2RlLCBsYXZhYW4sDQogICAgICAgICAgICAgICAgICAgICBzZW1Ub29scywgbGF2YWFuLnN1cnZleSwNCiAgICAgICAgICAgICAgICAgICAgIHN1cnZleSwgcmVzaGFwZTIsIGZhdnN0YXRzLA0KICAgICAgICAgICAgICAgICAgICAgbWFncml0dHIpDQpgYGANCg0KIyBMb2FkaW5nIHRoZSBVUkxzDQoNCmBgYHtyfQ0KYWZybzVfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL2Fmcm81LlJEYXRhIikNCmFmcm82X3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9hZnJvNi5SRGF0YSIpDQoNCmxhdGlubzIwMTNfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL2xhdGlubzIwMTMuUkRhdGEiKQ0KbGF0aW5vMjAxNV91cmwgPC0gdXJsKCJodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvbGF0aW5vMjAxNS5SRGF0YSIpDQoNCnd2c19yYXdfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL3d2c19yYXcuUkRhdGEiKQ0KDQphbWVyaWNhc191cmwgPC0gdXJsKCJodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvYW1lcmljYXMuUkRhdGEiKQ0KYm9saXZpYV91cmwgPC0gdXJsKCJodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvYm9saXZpYS5SRGF0YSIpDQpjYW5hZGFfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL2NhbmFkYS5SRGF0YSIpDQoNCmFzaWFuX3Jhd191cmwgPC0gdXJsKCJodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvYXNpYW5fcmF3LlJEYXRhIikNCm15YW5tYXJfcmF3X3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9teWFubWFyX3Jhdy5SRGF0YSIpDQptb25nb2xpYV9yYXdfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL21vbmdvbGlhX3Jhdy5SRGF0YSIpDQpwaGlsaXBfcmF3X3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9waGlsaXBfcmF3LlJEYXRhIikNCnRhaXdhbl9yYXdfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL3RhaXdhbl9yYXcuUkRhdGEiKQ0KdGhhaV9yYXdfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL3RoYWlfcmF3LlJEYXRhIikNCm1hbGF5X3Jhd191cmwgPC0gdXJsKCJodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvbWFsYXlfcmF3LlJEYXRhIikNCnNpbmdhcG9yZV9yYXdfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL3NpbmdhcG9yZV9yYXcuUkRhdGEiKQ0Kc2tfcmF3X3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9za19yYXcuUkRhdGEiKQ0KY2FtYm9kaWFfcmF3X3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9jYW1ib2RpYV9yYXcuUkRhdGEiKQ0KDQpFU1NfcmF3X3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9ibG9iL21hc3Rlci9FU1NfcmF3LlJkYXRhP3Jhdz10cnVlIikNCg0KdmRlbXNfc3RhcnRfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL3ZkZW1zX3N0YXJ0LlJkYXRhIikNCg0KcW9nX3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9xb2cuUmRhdGEiKQ0KDQpgYGANCg0KDQojIEFmcm9iYXJvbWV0ZXIgRGF0YQ0KDQojIyBBZnJvIDUNCg0KYGBge3J9DQpsb2FkKGFmcm81X3VybCkNCg0KZGVsZXRlX25hX2Fmcm8gPC0gZnVuY3Rpb24oeCkgew0KICB4IDwtIFJlY29kZSh4LCAiOSA9IE5BOw0KICAgICAgICAgICAgOTggPSBOQTsNCiAgICAgICAgICAgIDk5ID0gTkE7DQogICAgICAgICAgICAtMSA9IE5BIikNCiAgcmV0dXJuKHgpDQp9ICMgRnVua3Rpb24gdW0gZGllIE5BcyBpbSBBZnJvIERhdGVuc2F0eiB6dSBiZXN0aW1tZW4NCg0KIyBhbGxlIFZhcmlhYmxlbg0KYWZyb181IDwtIGFmcm81ICU+JQ0KICByZW5hbWUoDQogICAgZWR1YyA9IFE5NywgIyBWYXJpYWJsZW4gdW1iZW5lbm5lbg0KICAgIGluY29tZSA9IFEzQiwNCiAgICBzZXggPSBRMTAxLA0KICAgIHdvcmsgPSBROTYsDQogICAgdHJ1c3RfZ292ID0gUTU5QSwNCiAgICB0cnVzdF9wYXJsaWFtZW50ID0gUTU5QiwNCiAgICB0cnVzdF9wb2xpY2UgPSBRNTlILA0KICAgIHRydXN0X2NvdXJ0cyA9IFE1OUosDQogICAgZGVtdG9kYXkgPSBRNDZBDQogICkgJT4lDQogIG11dGF0ZV9hdCgNCiAgICB2YXJzKA0KICAgICAgaW5jb21lLCB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cywgd29yaw0KICAgICksDQogICAgZGVsZXRlX25hX2Fmcm8NCiAgKSAlPiUgIyBOQXMgZGVsZXRlbg0KICBtdXRhdGUoDQogICAgc2V4ID0gc2V4IC0gMSwgIyBzZXggKDAvMSkgY29kaWVyZW4NCiAgICB3b3JrID0gUmVjb2RlKA0KICAgICAgd29yaywgIyB3b3JrICgwLzEpIGNvZGllcmVuDQogICAgICAiMSA9IDA7DQogICAgICAgMiA9IDE7DQogICAgICAgMyA9IDEiDQogICAgKSwNCiAgICBhZ2UgPSBSZWNvZGUoDQogICAgICBRMSwgIyBtaXNzaW5nIHZhbHVlcyBsP3NjaGVuDQogICAgICAiLTEgPSBOQTsNCiAgICAgIDk5OCA9IE5BOw0KICAgICAgOTk5ID0gTkEiDQogICAgKSwNCiAgICBkZW10b2RheSA9IFJlY29kZSgNCiAgICAgIGRlbXRvZGF5LA0KICAgICAgIi0xID0gTkE7DQogICAgICAgOTggPSBOQTsNCiAgICAgICA5OSA9IE5BIg0KICAgICksDQogICAgZWR1YyA9IFJlY29kZSgNCiAgICAgIGVkdWMsDQogICAgICAiLTEgPSBOQTsNCiAgICAgICA5OCA9IE5BOw0KICAgICAgIDk5ID0gTkE7DQogICAgICA5OTkgPSBOQSINCiAgICApLA0KICAgIGNudHJ5ID0gdG9fbGFiZWwoQ09VTlRSWV9BTFBIQSksDQogICAgeWVhciA9IGFzLm51bWVyaWMoZm9ybWF0KERBVEVJTlRSLCAiJVkiKSkNCiAgKSAlPiUNCiAgc2VsZWN0KA0KICAgIGNudHJ5LCB5ZWFyLCBhZ2UsIHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCBkZW10b2RheSwgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICkgJT4lDQogIG11dGF0ZV9hdCgNCiAgICB2YXJzKA0KICAgICAgaW5jb21lLCBkZW10b2RheSwgZWR1YywNCiAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICAgKSwNCiAgICByYW5nZTAxDQogICkNCg0KYWZyb181DQpgYGANCg0KIyMgQWZybyA2DQoNCmBgYHtyfQ0KbG9hZChhZnJvNl91cmwpDQoNCmFmcm9fNiA8LSBhZnJvNiAlPiUNCiAgcmVuYW1lKA0KICAgIGVkdWMgPSBROTcsDQogICAgaW5jb21lID0gUTRCLA0KICAgIHNleCA9IFExMDEsDQogICAgd29yayA9IFE5NSwNCiAgICB0cnVzdF9nb3YgPSBRNTJBLA0KICAgIHRydXN0X3BhcmxpYW1lbnQgPSBRNTJCLA0KICAgIHRydXN0X3BvbGljZSA9IFE1MkgsDQogICAgdHJ1c3RfY291cnRzID0gUTUySiwNCiAgICBkZW10b2RheSA9IFE0MA0KICApICU+JQ0KICBtdXRhdGVfYXQoDQogICAgdmFycygNCiAgICAgIGluY29tZSwgZGVtdG9kYXksIHRydXN0X2dvdiwNCiAgICAgIHRydXN0X3BhcmxpYW1lbnQsIHRydXN0X3BvbGljZSwNCiAgICAgIHRydXN0X2NvdXJ0cywgd29yaw0KICAgICksDQogICAgZGVsZXRlX25hX2Fmcm8NCiAgKSAlPiUgIyBOQXMgZGVsZXRlbg0KICBtdXRhdGUoDQogICAgc2V4ID0gc2V4IC0gMSwgIyBzZXggKDAvMSkgY29kaWVyZW4NCiAgICB3b3JrID0gUmVjb2RlKA0KICAgICAgd29yaywgIyB3b3JrICgwLzEpIGNvZGllcmVuDQogICAgICAiMSA9IDA7DQogICAgICAgMiA9IDE7DQogICAgICAgMyA9IDEiDQogICAgKSwNCiAgICBhZ2UgPSBSZWNvZGUoDQogICAgICBRMSwgIyBtaXNzaW5nIHZhbHVlcyBsP3NjaGVuDQogICAgICAiLTEgPSBOQTsNCiAgICAgIDk5OCA9IE5BOw0KICAgICAgOTk5ID0gTkEiDQogICAgKSwNCiAgICBlZHVjID0gUmVjb2RlKA0KICAgICAgZWR1YywNCiAgICAgICItMSA9IE5BOw0KICAgICAgIDk4ID0gTkE7DQogICAgICAgOTkgPSBOQTsNCiAgICAgIDk5OSA9IE5BIg0KICAgICksDQogICAgZGVtdG9kYXkgPSBSZWNvZGUoDQogICAgICBkZW10b2RheSwNCiAgICAgICI4ID0gTkEiDQogICAgKSwNCiAgICBjbnRyeSA9IHRvX2xhYmVsKENPVU5UUllfUjVMaXN0KSwNCiAgICB5ZWFyID0gYXMubnVtZXJpYyhmb3JtYXQoREFURUlOVFIsICIlWSIpKQ0KICApICU+JQ0KICBzZWxlY3QoDQogICAgY250cnksIHllYXIsIGFnZSwgc2V4LCBpbmNvbWUsDQogICAgZWR1Yywgd29yaywgZGVtdG9kYXksDQogICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICkgJT4lDQogICMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIGFnZSwNCiAgIyAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAjICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksDQogICMgICAgICAgICAgICBhcy5jaGFyYWN0ZXIpICU+JQ0KICAjICBtdXRhdGVfYXQodmFycyhpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLCBhZ2UsDQogICMgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgIyAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLA0KICAjICAgICAgICAgICAgYXMubnVtZXJpYykgJT4lDQogIG11dGF0ZV9hdCgNCiAgICB2YXJzKA0KICAgICAgaW5jb21lLCBkZW10b2RheSwgZWR1YywNCiAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICAgKSwNCiAgICByYW5nZTAxDQogICkNCmFmcm9fNg0KDQpgYGANCg0KIyMgTWVyZ2luZyB0aGUgRGF0YQ0KDQpgYGB7cn0NCmFmcm9fcmVhbCA8LSBhZnJvXzUgJT4lIHNlbGVjdCgNCiAgY250cnksIHllYXIsIGVkdWMsIGluY29tZSwgDQogIHNleCwgYWdlLCB3b3JrLCBkZW10b2RheSwgDQogIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCikNCg0KYWZyb19yZWFsMiA8LSBhZnJvXzYgJT4lIHNlbGVjdCgNCiAgY250cnksIHllYXIsIGVkdWMsIGluY29tZSwgDQogIHNleCwgYWdlLCB3b3JrLCBkZW10b2RheSwgDQogIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCikNCiMgbGVuZ3RoKHVuaXF1ZShhZnJvX3JlYWwkY250cnkpKQ0KIyBsZW5ndGgodW5pcXVlKGFmcm9fcmVhbDIkY250cnkpKQ0KIyB0YWJsZShhZnJvX3JlYWwyJHllYXIpDQoNCmFmcm8gPC0gcmJpbmQoYWZyb19yZWFsLCBhZnJvX3JlYWwyKSAlPiUgYXMudGJsKCkNCg0KYWZybw0KYGBgDQoNCiMgTGF0aW5vIEJhcm9tZXRybw0KDQojIyBMYXRpbm8gMjAxMw0KDQpgYGB7cn0NCmxvYWQobGF0aW5vMjAxM191cmwpDQoNCmxhdGlub18yMDEzIDwtIGxhdGlubzIwMTMgJT4lDQogIHJlbmFtZSgNCiAgICBlZHVjID0gUkVFRFVDXzEsDQogICAgaW5jb21lID0gUzYsDQogICAgZGVtdG9kYXkgPSBQNTBUR0IuQSwNCiAgICBhZ2UgPSBTMTENCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIHNleCA9IFMxMCAtIDEsICMgc2V4IHZhcmlhYmxlIGVyc3RlbGxlbg0KICAgIGNudHJ5ID0gdG9fbGFiZWwoSURFTlBBKSwgIyBjbnRyeSB2YXJpYWJsZSBlcnN0ZWxsZW4NCiAgICB0cnVzdF9nb3YgPSA1IC0gUDI2VEdCLkIsDQogICAgdHJ1c3RfcGFybGlhbWVudCA9IDUgLSBQMjZUR0IuQywNCiAgICB0cnVzdF9wb2xpY2UgPSA1IC0gUDI4VEdCLkIsDQogICAgdHJ1c3RfY291cnRzID0gNSAtIFAyNlRHQi5FLA0KICAgIHllYXIgPSAyMDEzLA0KICAgIGluY29tZSA9IDUgLSBpbmNvbWUsDQogICAgd29yayA9IFJlY29kZSgNCiAgICAgIFMxOS5BLA0KICAgICAgIjIgPSAxOw0KICAgICAgIDMgPSAxOw0KICAgICAgIDQgPSAwOw0KICAgICAgIDUgPSAwOw0KICAgICAgIDYgPSAwOw0KICAgICAgIDcgPSAwIg0KICAgICkNCiAgKSAlPiUNCiAgc2VsZWN0KA0KICAgIGNudHJ5LCB5ZWFyLCBhZ2UsIHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCBkZW10b2RheSwgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICkgJT4lDQogICMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsDQogICMgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgIyAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLA0KICAjICAgICAgICAgICAgYXMuY2hhcmFjdGVyKSAlPiUNCiAgIyAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywNCiAgIyAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAjICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksDQogICMgICAgICAgICAgICBhcy5udW1lcmljKSAlPiUNCiAgbXV0YXRlX2F0KA0KICAgIHZhcnMoDQogICAgICBpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLA0KICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICApLA0KICAgIHJhbmdlMDENCiAgKQ0KDQpsYXRpbm9fMjAxMw0KYGBgDQoNCiMjIExhdGlubyAyMDE1DQoNCmBgYHtyfQ0KbG9hZChsYXRpbm8yMDE1X3VybCkNCg0KbGF0aW5vXzIwMTUgPC0gbGF0aW5vMjAxNSAlPiUNCiAgbXV0YXRlKHNleCA9IFMxMiAtIDEpICU+JSAjIHNleCB2YXJpYWJsZSBlcnN0ZWxsZW4NCiAgcmVuYW1lKA0KICAgIGVkdWMgPSBSRUVEVUNfMSwNCiAgICBpbmNvbWUgPSBTNCwNCiAgICBkZW10b2RheSA9IFAxN1NUR0JTLA0KICAgIGFnZSA9IFMxMw0KICApICU+JQ0KICBtdXRhdGUoDQogICAgdHJ1c3RfZ292ID0gNSAtIFAxNlNULkcsDQogICAgdHJ1c3RfcGFybGlhbWVudCA9IDUgLSBQMTZTVC5GLA0KICAgIHRydXN0X3BvbGljZSA9IDUgLSBQMTZUR0IuQiwNCiAgICB0cnVzdF9jb3VydHMgPSA1IC0gUDE2U1QuSCwNCiAgICB3b3JrID0gUmVjb2RlKA0KICAgICAgUzIxLkEsDQogICAgICAiMiA9IDE7DQogICAgICAgMyA9IDE7DQogICAgICAgNCA9IDA7DQogICAgICAgNSA9IDA7DQogICAgICAgNiA9IDA7DQogICAgICAgNyA9IDAiDQogICAgKSwNCiAgICBjbnRyeSA9IHRvX2xhYmVsKElERU5QQSksDQogICAgaW5jb21lID0gNSAtIGluY29tZSwNCiAgICB5ZWFyID0gMjAxNQ0KICApICU+JQ0KICBzZWxlY3QoDQogICAgY250cnksIHllYXIsIGFnZSwgc2V4LCBpbmNvbWUsIGVkdWMsIHdvcmssIGRlbXRvZGF5LCB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgKSAlPiUNCiAgIyAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywNCiAgIyAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAjICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3RlcikgJT4lDQogICMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsDQogICMgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgIyAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5udW1lcmljKSAlPiUNCiAgbXV0YXRlX2F0KA0KICAgIHZhcnMoDQogICAgICBpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLA0KICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICApLA0KICAgIHJhbmdlMDENCiAgKQ0KDQpsYXRpbm9fMjAxNQ0KYGBgDQoNCiMjIE1lcmdpbmcgdGhlIERhdGENCg0KYGBge3J9DQpsYXRpbm9fcmVhbCA8LSBsYXRpbm9fMjAxMyAlPiUgc2VsZWN0KA0KICBjbnRyeSwgeWVhciwgZWR1YywgaW5jb21lLCANCiAgc2V4LCBhZ2UsIHdvcmssIGRlbXRvZGF5LCANCiAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KKQ0KDQpsYXRpbm9fcmVhbDIgPC0gbGF0aW5vXzIwMTUgJT4lIHNlbGVjdCgNCiAgY250cnksIHllYXIsIGVkdWMsIGluY29tZSwgDQogIHNleCwgYWdlLCB3b3JrLCBkZW10b2RheSwgDQogIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCikNCg0KbGF0aW5vIDwtIHJiaW5kKGxhdGlub19yZWFsLCBsYXRpbm9fcmVhbDIpICU+JSBhcy50YmwoKQ0KDQpsYXRpbm8NCg0KYGBgDQoNCg0KDQojIFdvcmxkIFZhbHVlIFN1cnZleQ0KDQpgYGB7cn0NCmxvYWQod3ZzX3Jhd191cmwpDQoNCnd2cyA8LSB3dnNfcmF3ICU+JQ0KICByZW5hbWUoDQogICAgZWR1YyA9IFYyNDgsDQogICAgaW5jb21lID0gVjIzOSwNCiAgICBkZW10b2RheSA9IFYxNDEsDQogICAgYWdlID0gVjI0MiwNCiAgICB5ZWFyID0gVjI2Mg0KICApICU+JQ0KICBtdXRhdGUoDQogICAgc2V4ID0gVjI0MCAtIDEsICMgc2V4IHZhcmlhYmxlIGVyc3RlbGxlbg0KICAgIHRydXN0X2dvdiA9IDUgLSBWMTE1LA0KICAgIHRydXN0X3BhcmxpYW1lbnQgPSA1IC0gVjExNywNCiAgICB0cnVzdF9wb2xpY2UgPSA1IC0gVjExMywNCiAgICB0cnVzdF9jb3VydHMgPSA1IC0gVjExNCwNCiAgICB3b3JrID0gUmVjb2RlKA0KICAgICAgVjIyOSwNCiAgICAgICIyID0gMTsNCiAgICAgICAzID0gMTsNCiAgICAgICA0ID0gMDsNCiAgICAgICA1ID0gMDsNCiAgICAgICA2ID0gMDsNCiAgICAgICA3ID0gMDsNCiAgICAgICA4ID0gMCINCiAgICApLA0KICAgIGNudHJ5ID0gdG9fbGFiZWwoVjIpDQogICkgJT4lDQogIHNlbGVjdCgNCiAgICBjbnRyeSwgeWVhciwgYWdlLCBzZXgsIGluY29tZSwgZWR1Yywgd29yaywgZGVtdG9kYXksDQogICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICkgJT4lDQogIG11dGF0ZV9hdCgNCiAgICB2YXJzKA0KICAgICAgaW5jb21lLCBkZW10b2RheSwgZWR1YywNCiAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICAgKSwNCiAgICBhcy5jaGFyYWN0ZXINCiAgKSAlPiUNCiAgbXV0YXRlX2F0KA0KICAgIHZhcnMoDQogICAgICBpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLA0KICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICApLA0KICAgIGFzLm51bWVyaWMNCiAgKSAlPiUNCiAgbXV0YXRlX2F0KA0KICAgIHZhcnMoDQogICAgICBpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLA0KICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICApLA0KICAgIHJhbmdlMDENCiAgKQ0KDQoNCg0Kd3ZzDQpgYGANCg0KIyBBbWVyaWNhcyBCYXJvbWV0ZXINCg0KIyMgQW1lcmljYXMgTWFpbg0KDQpgYGB7cn0NCmxvYWQoYW1lcmljYXNfdXJsKQ0KDQphbWVyaWNhc18gPC0gYW1lcmljYXMgJT4lDQogIG11dGF0ZShjbnRyeSA9IHRvX2xhYmVsKHBhaXMpKSAlPiUNCiAgc2VsZWN0KA0KICAgIGNudHJ5LCBvY3VwNGEsIGVkLCBxMTBuZXcsIHExLCBxMiwNCiAgICBiMTBhLCBiMTMsIGIxOCwgYjIxYSwgbjMsIHllYXINCiAgKSAlPiUNCiAgcmVuYW1lKA0KICAgIHdvcmsgPSBvY3VwNGEsDQogICAgZWR1YyA9IGVkLA0KICAgIGluY29tZSA9IHExMG5ldywNCiAgICBzZXggPSBxMSwNCiAgICBhZ2UgPSBxMiwNCiAgICB0cnVzdF9jb3VydHMgPSBiMTBhLA0KICAgIHRydXN0X3BhcmxpYW1lbnQgPSBiMTMsDQogICAgdHJ1c3RfcG9saWNlID0gYjE4LA0KICAgIHRydXN0X2dvdiA9IGIyMWEsDQogICAgZGVtdG9kYXkgPSBuMw0KICApICU+JQ0KICBtdXRhdGUoDQogICAgc2V4ID0gc2V4IC0gMSwgIyBzZXggdmFyaWFibGUgZXJzdGVsbGVuDQogICAgd29yayA9IFJlY29kZSgNCiAgICAgIHdvcmssDQogICAgICAiMiA9IDE7DQogICAgICAgMyA9IDE7DQogICAgICAgNCA9IDA7DQogICAgICAgNSA9IDA7DQogICAgICAgNiA9IDA7DQogICAgICAgNyA9IDAiDQogICAgKQ0KICApICU+JQ0KICBtdXRhdGVfYXQoDQogICAgdmFycygNCiAgICAgIGluY29tZSwgZGVtdG9kYXksIGVkdWMsDQogICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICAgICksDQogICAgcmFuZ2UwMQ0KICApDQoNCmFtZXJpY2FzXw0KYGBgDQoNCg0KIyMgQm9saXZpYQ0KDQpgYGB7cn0NCmxvYWQoYm9saXZpYV91cmwpDQoNCmJvbGl2aWFfIDwtIGJvbGl2aWEgJT4lDQogIG11dGF0ZShjbnRyeSA9IHRvX2xhYmVsKHBhaXMpKSAlPiUNCiAgc2VsZWN0KA0KICAgIGNudHJ5LCBvY3VwNGEsIGVkLCBxMTBuZXcsIHExLCBxMiwNCiAgICBiMTBhLCBiMTMsIGIxOCwgYjIxYSwgbjMsIHllYXINCiAgKSAlPiUNCiAgcmVuYW1lKA0KICAgIHdvcmsgPSBvY3VwNGEsDQogICAgZWR1YyA9IGVkLA0KICAgIGluY29tZSA9IHExMG5ldywNCiAgICBzZXggPSBxMSwNCiAgICBhZ2UgPSBxMiwNCiAgICB0cnVzdF9jb3VydHMgPSBiMTBhLA0KICAgIHRydXN0X3BhcmxpYW1lbnQgPSBiMTMsDQogICAgdHJ1c3RfcG9saWNlID0gYjE4LA0KICAgIHRydXN0X2dvdiA9IGIyMWEsICMgdmllbGUgbWlzc2luZyB2YWx1ZXMNCiAgICBkZW10b2RheSA9IG4zDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBzZXggPSBzZXggLSAxLCAjIHNleCB2YXJpYWJsZSBlcnN0ZWxsZW4NCiAgICB3b3JrID0gUmVjb2RlKA0KICAgICAgd29yaywNCiAgICAgICIyID0gMTsNCiAgICAgICAzID0gMTsNCiAgICAgICA0ID0gMDsNCiAgICAgICA1ID0gMDsNCiAgICAgICA2ID0gMDsNCiAgICAgICA3ID0gMCINCiAgICApDQogICkgJT4lDQogIG11dGF0ZV9hdCgNCiAgICB2YXJzKA0KICAgICAgaW5jb21lLCBkZW10b2RheSwgZWR1YywNCiAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICAgKSwNCiAgICByYW5nZTAxDQogICkNCg0KYm9saXZpYV8NCmBgYA0KDQojIyBDYW5hZGENCg0KYGBge3J9DQpsb2FkKGNhbmFkYV91cmwpDQoNCmNhbmFkYV8gPC0gY2FuYWRhICU+JQ0KICBtdXRhdGUoY250cnkgPSB0b19sYWJlbChwYWlzKSkgJT4lDQogIHNlbGVjdCgNCiAgICBjbnRyeSwgZXhjMTMsIGVkdWNhdGlvbiwgcTEwLCBxMSwgcTIsDQogICAgYjEwYSwgYjEzLCBiMTgsIGIyMWEsIG4zLCB5ZWFyDQogICkgJT4lDQogIHJlbmFtZSgNCiAgICB3b3JrID0gZXhjMTMsDQogICAgZWR1YyA9IGVkdWNhdGlvbiwNCiAgICBpbmNvbWUgPSBxMTAsDQogICAgc2V4ID0gcTEsDQogICAgYWdlID0gcTIsDQogICAgdHJ1c3RfY291cnRzID0gYjEwYSwNCiAgICB0cnVzdF9wYXJsaWFtZW50ID0gYjEzLA0KICAgIHRydXN0X3BvbGljZSA9IGIxOCwNCiAgICB0cnVzdF9nb3YgPSBiMjFhLA0KICAgIGRlbXRvZGF5ID0gbjMNCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIHNleCA9IHNleCAtIDEsICMgc2V4IHZhcmlhYmxlIGVyc3RlbGxlbg0KICAgIHdvcmsgPSB3b3JrIC0gMSwNCiAgICBpbmNvbWUgPSBpZmVsc2UoaW5jb21lID09IDg4LCBOQSwgaW5jb21lKQ0KICApICU+JQ0KICBtdXRhdGVfYXQoDQogICAgdmFycygNCiAgICAgIGluY29tZSwgZGVtdG9kYXksIGVkdWMsDQogICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICAgICksDQogICAgcmFuZ2UwMQ0KICApDQoNCmNhbmFkYV8NCmBgYA0KDQojIyBNZXJnaW5nIHRoZSBEYXRhDQoNCmBgYHtyfQ0KYW1lcmljYXMgPC0gYW1lcmljYXNfICU+JSBkcGx5cjo6c2VsZWN0KA0KICBjbnRyeSwgeWVhciwgZWR1YywgaW5jb21lLCANCiAgc2V4LCBhZ2UsIHdvcmssIGRlbXRvZGF5LCANCiAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KKQ0KDQpib2xpdmlhIDwtIGJvbGl2aWFfICU+JSBkcGx5cjo6c2VsZWN0KA0KICBjbnRyeSwgeWVhciwgZWR1YywgaW5jb21lLCANCiAgc2V4LCBhZ2UsIHdvcmssIGRlbXRvZGF5LCANCiAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KKQ0KDQpjYW5hZGEgPC0gY2FuYWRhXyAlPiUgZHBseXI6OnNlbGVjdCgNCiAgY250cnksIHllYXIsIGVkdWMsIGluY29tZSwgDQogIHNleCwgYWdlLCB3b3JrLCBkZW10b2RheSwgDQogIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCikNCg0KDQphbWVyaWNhcyA8LSByYmluZChhbWVyaWNhcywgYm9saXZpYSwgY2FuYWRhKQ0KDQphbWVyaWNhcw0KYGBgDQoNCiMgQXNpYW4gQmFyb21ldGVyDQoNCmBgYHtyfQ0KbG9hZChhc2lhbl9yYXdfdXJsKQ0KDQpkZWxldGVfbmFfYXNpYW4gPC0gZnVuY3Rpb24oeCkgew0KICB4IDwtIFJlY29kZSgNCiAgICB4LA0KICAgICItMiA9IE5BOw0KICAgICAgNyA9IE5BOw0KICAgICAgOCA9IE5BOw0KICAgICAgOSA9IE5BOw0KICAgICA5NyA9IE5BOw0KICAgICA5OCA9IE5BOw0KICAgICA5OSA9IE5BOw0KICAgICAtMSA9IE5BIg0KICApDQoNCiAgcmV0dXJuKHgpDQp9ICMgRnVua3Rpb24gdW0gZGllIE5BcyBpbSBhc2lhbiBEYXRlbnNhdHogenUgYmVzdGltbWVuDQoNCmFzaWFuXzMgPC0gYXNpYW5fcmF3ICU+JQ0KICByZW5hbWUoDQogICAgZWR1YyA9IHNlNSwNCiAgICB0cnVzdF9nb3YgPSBxOSwNCiAgICB0cnVzdF9wYXJsaWFtZW50ID0gcTExLA0KICAgIHRydXN0X3BvbGljZSA9IHExNCwNCiAgICB0cnVzdF9jb3VydHMgPSBxOCwNCiAgICBzZXggPSBzZTIsDQogICAgaW5jb21lID0gc2UxM2EsDQogICAgd29yayA9IHNlOQ0KICApICU+JQ0KICBtdXRhdGVfYXQoDQogICAgdmFycygNCiAgICAgIGluY29tZSwgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMsIHdvcmssIHNleA0KICAgICksDQogICAgZGVsZXRlX25hX2FzaWFuDQogICkgJT4lICMgTkFzIGRlbGV0ZW4NCiAgbXV0YXRlKA0KICAgIHRydXN0X2dvdiA9IDUgLSB0cnVzdF9nb3YsDQogICAgdHJ1c3RfcGFybGlhbWVudCA9IDUgLSB0cnVzdF9wYXJsaWFtZW50LA0KICAgIHRydXN0X3BvbGljZSA9IDUgLSB0cnVzdF9wb2xpY2UsDQogICAgdHJ1c3RfY291cnRzID0gNSAtIHRydXN0X2NvdXJ0cywNCiAgICBzZXggPSBzZXggLSAxLCAjIHNleCAoMC8xKSBjb2RpZXJlbg0KICAgIGluY29tZSA9IFJlY29kZSgNCiAgICAgIGluY29tZSwNCiAgICAgICIwID0gTkEiDQogICAgKSwNCiAgICBpbmNvbWUgPSA1IC0gaW5jb21lLA0KICAgIHdvcmsgPSBSZWNvZGUoDQogICAgICB3b3JrLCAjIHdvcmsgKDAvMSkgY29kaWVyZW4NCiAgICAgICIyID0gMCINCiAgICApLA0KICAgIGFnZSA9IFJlY29kZSgNCiAgICAgIHNlM2EsICMgbWlzc2luZyB2YWx1ZXMgbD9zY2hlbg0KICAgICAgIi0xID0gTkEiDQogICAgKSwNCiAgICBkZW10b2RheSA9IFJlY29kZSgNCiAgICAgIHE5MSwNCiAgICAgICItMSA9IE5BOw0KICAgICAgIDk3ID0gTkE7DQogICAgICAgOTggPSBOQTsNCiAgICAgICA5OSA9IE5BIg0KICAgICksDQogICAgZWR1YyA9IFJlY29kZSgNCiAgICAgIGVkdWMsDQogICAgICAiLTEgPSBOQTsNCiAgICAgICA5OCA9IE5BOw0KICAgICAgIDk5ID0gTkEiDQogICAgKSwNCiAgICBjbnRyeSA9IHRvX2xhYmVsKGNvdW50cnkpLA0KICAgIHllYXIgPSBhcy5udW1lcmljKGZvcm1hdChpcjksICIlWSIpKQ0KICApICU+JQ0KICBzZWxlY3QoDQogICAgY250cnksIHllYXIsIGFnZSwgc2V4LCBpbmNvbWUsIGVkdWMsIHdvcmssIGRlbXRvZGF5LCB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgKSAlPiUNCiAgIyAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywgYWdlLA0KICAjICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICMgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwNCiAgIyAgICAgICAgICAgIGFzLmNoYXJhY3RlcikgJT4lDQogICMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIGFnZSwNCiAgIyAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAjICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksDQogICMgICAgICAgICAgICBhcy5udW1lcmljKSAlPiUNCiAgbXV0YXRlX2F0KA0KICAgIHZhcnMoDQogICAgICBpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLA0KICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICApLA0KICAgIHJhbmdlMDENCiAgKQ0KDQphc2lhbl8zDQoNCmBgYA0KDQojIyBXYXZlIDQNCg0KYGBge3J9DQpsb2FkKG15YW5tYXJfcmF3X3VybCkNCg0KbmVlZGVkIDwtIGZ1bmN0aW9uKGRhdGEpIHsNCiAgc3MgPC0gZGF0YSAlPiUNCiAgICByZW5hbWUoDQogICAgICBlZHVjID0gc2U1LA0KICAgICAgdHJ1c3RfZ292ID0gcTksDQogICAgICB0cnVzdF9wYXJsaWFtZW50ID0gcTExLA0KICAgICAgdHJ1c3RfcG9saWNlID0gcTE0LA0KICAgICAgdHJ1c3RfY291cnRzID0gcTgsDQogICAgICBzZXggPSBzZTIsDQogICAgICBpbmNvbWUgPSBzZTEzYSwNCiAgICAgIHdvcmsgPSBzZTkNCiAgICApICU+JQ0KICAgIG11dGF0ZV9hdCgNCiAgICAgIHZhcnMoDQogICAgICAgIGluY29tZSwgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cywgd29yaywgc2V4DQogICAgICApLA0KICAgICAgZGVsZXRlX25hX2FzaWFuDQogICAgKSAlPiUgIyBOQXMgZGVsZXRlbg0KICAgIG11dGF0ZSgNCiAgICAgIHRydXN0X2dvdiA9IDUgLSB0cnVzdF9nb3YsDQogICAgICB0cnVzdF9wYXJsaWFtZW50ID0gNSAtIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICB0cnVzdF9wb2xpY2UgPSA1IC0gdHJ1c3RfcG9saWNlLA0KICAgICAgdHJ1c3RfY291cnRzID0gNSAtIHRydXN0X2NvdXJ0cywNCiAgICAgIHNleCA9IHNleCAtIDEsICMgc2V4ICgwLzEpIGNvZGllcmVuDQogICAgICBpbmNvbWUgPSBSZWNvZGUoDQogICAgICAgIGluY29tZSwNCiAgICAgICAgIjAgPSBOQSINCiAgICAgICksDQogICAgICB3b3JrID0gUmVjb2RlKA0KICAgICAgICB3b3JrLCAjIHdvcmsgKDAvMSkgY29kaWVyZW4NCiAgICAgICAgIjIgPSAwIg0KICAgICAgKSwNCiAgICAgIGFnZSA9IFJlY29kZSgNCiAgICAgICAgc2UzXzIsICMgbWlzc2luZyB2YWx1ZXMgbD9zY2hlbg0KICAgICAgICAiLTEgPSBOQSINCiAgICAgICksDQogICAgICBkZW10b2RheSA9IFJlY29kZSgNCiAgICAgICAgcTk0LA0KICAgICAgICAiLTEgPSBOQTsNCiAgICAgICAgIDk3ID0gTkE7DQogICAgICAgICA5OCA9IE5BOw0KICAgICAgICAgOTkgPSBOQSINCiAgICAgICksDQogICAgICBlZHVjID0gUmVjb2RlKA0KICAgICAgICBlZHVjLA0KICAgICAgICAiLTEgPSBOQTsNCiAgICAgICAgIDk4ID0gTkE7DQogICAgICAgICA5OSA9IE5BIg0KICAgICAgKSwNCiAgICAgIGNudHJ5ID0gdG9fbGFiZWwoY291bnRyeSksDQogICAgICB5ZWFyID0geWVhcg0KICAgICkgJT4lDQogICAgc2VsZWN0KA0KICAgICAgY250cnksIHllYXIsIGFnZSwgc2V4LCBpbmNvbWUsIGVkdWMsIHdvcmssIGRlbXRvZGF5LCANCiAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICApICU+JQ0KICAgICMgICBtdXRhdGVfYXQodmFycyhpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLCBhZ2UsDQogICAgIyAgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAjICAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLA0KICAgICMgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKSAlPiUNCiAgICAjICAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywgYWdlLA0KICAgICMgICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgIyAgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwNCiAgICAjICAgICAgICAgICAgIGFzLm51bWVyaWMpICU+JQ0KICAgIG11dGF0ZV9hdCgNCiAgICAgIHZhcnMoDQogICAgICAgIGluY29tZSwgZGVtdG9kYXksIGVkdWMsDQogICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICAgICksDQogICAgICByYW5nZTAxDQogICAgKQ0KICByZXR1cm4oc3MpDQp9DQpteWFubWFyIDwtIG5lZWRlZChteWFubWFyX3JhdykNCg0KbG9hZChtb25nb2xpYV9yYXdfdXJsKQ0KbG9hZChwaGlsaXBfcmF3X3VybCkNCmxvYWQodGFpd2FuX3Jhd191cmwpDQpsb2FkKHRoYWlfcmF3X3VybCkNCmxvYWQobWFsYXlfcmF3X3VybCkNCmxvYWQoc2luZ2Fwb3JlX3Jhd191cmwpDQpsb2FkKHNrX3Jhd191cmwpDQpsb2FkKGNhbWJvZGlhX3Jhd191cmwpDQoNCm1vbmdvbGlhIDwtIG5lZWRlZChtb25nb2xpYV9yYXcpDQpwaGlsaXAgPC0gbmVlZGVkKHBoaWxpcF9yYXcpDQp0YWl3YW4gPC0gbmVlZGVkKHRhaXdhbl9yYXcpDQp0aGFpIDwtIG5lZWRlZCh0aGFpX3JhdykNCm1hbGF5IDwtIG5lZWRlZChtYWxheV9yYXcpDQpzaW5nYXBvcmUgPC0gbmVlZGVkKHNpbmdhcG9yZV9yYXcpICMgU2luZ2Fwb3JlIGhhdCBleHRyZW0gdmllbGUgTWlzc2luZyB2YWx1ZXMNCnNrIDwtIG5lZWRlZChza19yYXcpDQpjYW1ib2RpYSA8LSBuZWVkZWQoY2FtYm9kaWFfcmF3KQ0KDQphc2lhbiA8LSByYmluZCgNCiAgYXNpYW5fMywgbXlhbm1hciwgY2FtYm9kaWEsIHNrLCBzaW5nYXBvcmUsIG1hbGF5LCB0aGFpLCB0YWl3YW4sIHBoaWxpcCwNCiAgY2FtYm9kaWEsIG1vbmdvbGlhDQopICU+JSBhcy50YmwoKQ0KDQphc2lhbg0KDQpgYGANCg0KDQojIEV1cm9wZWFuIFNvY2lhbCBTdXJ2ZXkNCg0KYGBge3J9DQpsb2FkKEVTU19yYXdfdXJsKQ0KDQpFU1MgPC0gRVNTX3JhdyAlPiUNCiAgcmVuYW1lKA0KICAgIGRlbXRvZGF5ID0gZG1jbnRvdiwNCiAgICBhZ2UgPSBhZ2VhLA0KICAgIHllYXIgPSBpbnd5eXMsDQogICAgdHJ1c3RfZ292ID0gdHJzdHBsdCwNCiAgICB0cnVzdF9wYXJsaWFtZW50ID0gdHJzdHBybCwNCiAgICB0cnVzdF9wb2xpY2UgPSB0cnN0cGxjLA0KICAgIHRydXN0X2NvdXJ0cyA9IHRyc3RsZ2wNCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIGluY29tZSA9IDUgLSBoaW5jZmVsLA0KICAgIGVkdWMgPSBSZWNvZGUoDQogICAgICBlaXNjZWQsDQogICAgICAiNTUgPSBOQSINCiAgICApLA0KICAgIHdvcmsgPSBpZmVsc2UobW5hY3RpYyA9PSAxLCAxLCAwKSwNCiAgICBzZXggPSBnbmRyIC0gMSwgIyBzZXggdmFyaWFibGUgZXJzdGVsbGVuDQogICAgY250cnkgPSB0b19sYWJlbChjbnRyeSkNCiAgKSAlPiUNCiAgc2VsZWN0KA0KICAgIGNudHJ5LCB5ZWFyLCBhZ2UsIHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCBkZW10b2RheSwgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICkgJT4lDQogICMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsDQogICMgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgIyAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLA0KICAjICAgICAgICAgICAgYXMuY2hhcmFjdGVyKSAlPiUNCiAgIyAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywNCiAgIyAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAjICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksDQogICMgICAgICAgICAgICBhcy5udW1lcmljKSAlPiUNCiAgbXV0YXRlX2F0KA0KICAgIHZhcnMoDQogICAgICBpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLA0KICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICApLA0KICAgIHN0ZHoNCiAgKSAlPiUNCiAgbXV0YXRlX2F0KA0KICAgIHZhcnMoDQogICAgICBpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLA0KICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICApLA0KICAgIHJhbmdlMDENCiAgKQ0KDQoNCkVTUw0KYGBgDQoNCg0KIyBNZXJnaW5nIEV2ZXJ5dGhpbmcNCg0KYGBge3J9DQoNCmFmcm8gJTw+JSANCiAgbXV0YXRlKHN1cnZleSA9IHJlcCgiYWZybyIsIG5yb3coYWZybykpKSAlPiUgDQogIG11dGF0ZShjbnRyeSA9IGNvdW50cnljb2RlKGNudHJ5LCAiY291bnRyeS5uYW1lLmVuIiwgImNvdW50cnkubmFtZS5lbiIpKQ0KDQpsYXRpbm8gJTw+JSAgDQogIG11dGF0ZShzdXJ2ZXkgPSByZXAoImxhdGlubyIsIG5yb3cobGF0aW5vKSkpICU+JSANCiAgbXV0YXRlKGNudHJ5ID0gY291bnRyeWNvZGUoY250cnksICJjb3VudHJ5Lm5hbWUuZW4iLCAiY291bnRyeS5uYW1lLmVuIikpDQoNCmFtZXJpY2FzICU8PiUgIA0KICBtdXRhdGUoc3VydmV5ID0gcmVwKCJhbWVyaWNhcyIsIG5yb3coYW1lcmljYXMpKSkgJT4lIA0KICBtdXRhdGUoY250cnkgPSBjb3VudHJ5Y29kZShjbnRyeSwgImNvdW50cnkubmFtZS5lbiIsICJjb3VudHJ5Lm5hbWUuZW4iKSkNCg0KYXNpYW4gJTw+JSAgDQogIG11dGF0ZShzdXJ2ZXkgPSByZXAoImFzaWFuIiwgbnJvdyhhc2lhbikpKSAlPiUgDQogIG11dGF0ZShjbnRyeSA9IGNvdW50cnljb2RlKGNudHJ5LCAiY291bnRyeS5uYW1lLmVuIiwgImNvdW50cnkubmFtZS5lbiIpKQ0KDQp3dnMgJTw+JSAgDQogIG11dGF0ZShzdXJ2ZXkgPSByZXAoInd2cyIsIG5yb3cod3ZzKSkpICU+JSANCiAgbXV0YXRlKGNudHJ5ID0gY291bnRyeWNvZGUoY250cnksICJjb3VudHJ5Lm5hbWUuZW4iLCAiY291bnRyeS5uYW1lLmVuIikpDQoNCkVTUyAlPD4lICANCiAgbXV0YXRlKHN1cnZleSA9IHJlcCgiRVNTIiwgbnJvdyhFU1MpKSkgJT4lIA0KICBtdXRhdGUoY250cnkgPSBjb3VudHJ5Y29kZShjbnRyeSwgImNvdW50cnkubmFtZS5lbiIsICJjb3VudHJ5Lm5hbWUuZW4iKSkNCg0KdW5pcXVlKEVTUyRjbnRyeSkNCnVuaXF1ZShhc2lhbiRjbnRyeSkNCnVuaXF1ZSh3dnMkY250cnkpDQp1bmlxdWUobGF0aW5vJGNudHJ5KQ0KdW5pcXVlKGFtZXJpY2FzJGNudHJ5KQ0KdW5pcXVlKGFmcm8kY250cnkpDQoNCm1lcmdlZCA8LSByYmluZCh3dnMsIGxhdGlubywgYWZybywgYW1lcmljYXMsIGFzaWFuLCBFU1MpDQoNCm1lcmdlZCAlPD4lDQogICMgY3JlYXRlIGR1bW1pZXMNCiAgbXV0YXRlKA0KICAgIHd2cyA9IGlmZWxzZShzdXJ2ZXkgPT0gInd2cyIsIDEsIDApLA0KICAgIGFmcm8gPSBpZmVsc2Uoc3VydmV5ID09ICJhZnJvIiwgMSwgMCksDQogICAgbGF0aW5vID0gaWZlbHNlKHN1cnZleSA9PSAibGF0aW5vIiwgMSwgMCksDQogICAgYW1lcmljYXMgPSBpZmVsc2Uoc3VydmV5ID09ICJhbWVyaWNhcyIsIDEsIDApLA0KICAgIGFzaWFuID0gaWZlbHNlKHN1cnZleSA9PSAiYXNpYW4iLCAxLCAwKSwNCiAgICBFU1MgPSBpZmVsc2Uoc3VydmV5ID09ICJFU1MiLCAxLCAwKQ0KICApICU+JQ0KICAjIGZpbHRlciBiYWQgY291bnRyaWVzDQogIGZpbHRlcihjbnRyeSAhPSAiRWd5cHQiKSAlPiUgIyBleGNsdWRlIEVneXB0IDIwMTMNCiAgZmlsdGVyKGNudHJ5ICE9ICJMaWJ5YSIpICU+JSAjIGV4Y2x1ZGUgTGlieWEgMjAxNA0KICBmaWx0ZXIoY250cnkgIT0gIk1hbGkiKSAlPiUgIyBleGNsdWRlIE1hbGkgMjAxMg0KICBmaWx0ZXIoY250cnkgIT0gIlllbWVuIikgJT4lICMgZXhjbHVkZSBZZW1lbiAyMDEyDQogIGZpbHRlcihjbnRyeSAhPSAiUGFsZXN0aW5lLCBTdGF0ZSBvZiIpICMgZXhjbHVkZSBQYWxlc3RpbmUgMjAxMw0KDQojIGFkZGluZyB3ZWlnaHQNCm1lcmdlZCAlPD4lDQogIGdyb3VwX2J5KGNudHJ5KSAlPiUNCiAgdGFsbHkoKSAlPiUNCiAgbXV0YXRlKHdlaWdodCA9IDEwMDAgLyBuKSAlPiUNCiAgc2VsZWN0KGNudHJ5LCB3ZWlnaHQpICU+JQ0KICBsZWZ0X2pvaW4obWVyZ2VkLCAiY250cnkiKQ0KIyBzZWxlY3QoY250cnksIHllYXIpICU+JQ0KIyB1bmlxdWUgJT4lDQojIFZpZXcNCg0KbWVyZ2VkDQoNCnRhYmxlKG1lcmdlZCR3dnMpDQp0YWJsZShtZXJnZWQkYWZybykNCnRhYmxlKG1lcmdlZCRsYXRpbm8pDQp0YWJsZShtZXJnZWQkYW1lcmljYXMpDQp0YWJsZShtZXJnZWQkYXNpYW4pDQp0YWJsZShtZXJnZWQkRVNTKQ0KYGBgDQoNCg0KDQojIyBTRU0gSW5kZXgNCg0KYGBge3J9DQptZXJnZWQyIDwtIG1lcmdlZCAlPiUNCiAgbXV0YXRlKGdvdl90cnVzdCA9IHRydXN0X2dvdiArIHRydXN0X3BhcmxpYW1lbnQgKyANCiAgICAgICAgICAgdHJ1c3RfcG9saWNlICsgdHJ1c3RfY291cnRzKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShnb3ZfdHJ1c3QpKQ0KDQptZXJnZWQzIDwtIG1lcmdlZCAlPiUNCiAgbXV0YXRlKGdvdl90cnVzdCA9IHRydXN0X2dvdiArIHRydXN0X3BhcmxpYW1lbnQgKyANCiAgICAgICAgICAgdHJ1c3RfcG9saWNlICsgdHJ1c3RfY291cnRzKSAlPiUNCiAgZmlsdGVyKGlzLm5hKGdvdl90cnVzdCkpDQoNCnN2eS5kZiA8LSBzdXJ2ZXk6OnN2eWRlc2lnbihpZD0gfjEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzPSB+d2VpZ2h0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT0gbWVyZ2VkKSANCg0KbW9kZWwgPC0gJyMgbWVhc3VyZW1lbnQgbW9kZWwgMQ0KZ292X3RydXN0MiA9fiAxKnRydXN0X2dvdiArIHRydXN0X3BhcmxpYW1lbnQgKyANCnRydXN0X3BvbGljZSArIHRydXN0X2NvdXJ0cw0KdHJ1c3RfZ292IH5+IHRydXN0X3BhcmxpYW1lbnQNCicNCg0KbWVyZ2VkIDwtIG1lcmdlZCAlPiUNCiAgbXV0YXRlX2F0KHZhcnModHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIGFzLm51bWVyaWMpDQoNCiMgY29yKG5hLm9taXQoZGF0YS5mcmFtZShtZXJnZWQkdHJ1c3RfZ292LA0KIyAgICAgICAgICAgICAgIG1lcmdlZCR0cnVzdF9wb2xpY2UsDQojICAgICAgICAgICAgICAgbWVyZ2VkJHRydXN0X2NvdXJ0cywNCiMgICAgICAgICAgICAgICBtZXJnZWQkdHJ1c3RfcGFybGlhbWVudCwNCiMgICAgICAgICAgICAgICBtZXJnZWQkZGVtdG9kYXkpKSkNCg0KbGF2YWFuX21vZGVsMTwtY2ZhKG1vZGVsLCBtZWFuc3RydWN0dXJlID0gVCwgDQogICAgICAgICAgICAgICAgICAgZGF0YSA9IGFzLmRhdGEuZnJhbWUobWVyZ2VkKSwNCiAgICAgICAgICAgICAgICAgICBlc3RpbWF0b3I9ICJNTE0iKQ0KDQpmaXRfYTE8LWxhdmFhbi5zdXJ2ZXkobGF2YWFuX21vZGVsMSwgDQogICAgICAgICAgICBlc3RpbWF0b3I9ICJNTE0iLCBzdXJ2ZXkuZGVzaWduPXN2eS5kZikNCnN1bW1hcnkoZml0X2ExLCBzdGFuZGFyZGl6ZWQ9VFJVRSxmaXQubWVhc3VyZXMgPSBUUlVFLCByc3EgPSBUKQ0KDQptZXJnZWQ0PC1jYmluZChtZXJnZWQyLCBwcmVkaWN0KGZpdF9hMSwgbmV3ZGF0YSA9IG1lcmdlZDIpKQ0KbWVyZ2VkNCRnb3ZfdHJ1c3QyPC1yYW5nZTAxKG1lcmdlZDQkZ292X3RydXN0MikNCg0KIyBoZWFkKG1lcmdlZDQpDQoNCm1lcmdlZDwtcGx5cjo6cmJpbmQuZmlsbChtZXJnZWQzLG1lcmdlZDQpDQptZXJnZWQkZ292X3RydXN0PC1tZXJnZWQkZ292X3RydXN0Mg0KaGVhZChtZXJnZWQpDQpgYGANCg0KDQojIyBTb21lIFJlY29kaW5nDQoNCmBgYHtyfQ0KdGFibGUobWVyZ2VkJGNudHJ5LG1lcmdlZCR5ZWFyKQ0KDQp0YWJsZShzdWJzZXQobWVyZ2VkLG1lcmdlZCRjbnRyeT09IkNoaW5hIikkc3VydmV5LA0KICAgICAgc3Vic2V0KG1lcmdlZCxtZXJnZWQkY250cnk9PSJDaGluYSIpJHllYXIpDQoNCm1lcmdlZCR5ZWFyW21lcmdlZCRjbnRyeT09IkNoaW5hIiAmIG1lcmdlZCR5ZWFyID09IDE1ODNdIDwtIDIwMTENCm1lcmdlZCR5ZWFyW21lcmdlZCRjbnRyeT09IkNoaW5hIiAmIG1lcmdlZCR5ZWFyID09IDIwMDBdIDwtIDIwMTENCm1lcmdlZCR5ZWFyW21lcmdlZCRjbnRyeT09IkNoaW5hIiAmIG1lcmdlZCR5ZWFyID09IDIwNzddIDwtIDIwMTENCm1lcmdlZCR5ZWFyW21lcmdlZCRjbnRyeT09IkNoaW5hIiAmIG1lcmdlZCR5ZWFyID09IDIwMTJdIDwtIDIwMTENCg0KdGFibGUoc3Vic2V0KG1lcmdlZCxtZXJnZWQkY250cnk9PSJTaW5nYXBvcmUiKSRzdXJ2ZXksDQogICAgICBzdWJzZXQobWVyZ2VkLG1lcmdlZCRjbnRyeT09IlNpbmdhcG9yZSIpJHllYXIpDQoNCm1lcmdlZCR5ZWFyW21lcmdlZCRjbnRyeT09IlNpbmdhcG9yZSIgJiBtZXJnZWQkeWVhciA9PSAxNTgyXSA8LSAyMDExDQoNCmhpc3QobWVyZ2VkJGdvdl90cnVzdCkNCmBgYA0KDQoNCg0KDQojIExldmVsIDIgRGF0YQ0KDQojIyBWLURlbQ0KDQpgYGB7cn0NCmxvYWQodmRlbXNfc3RhcnRfdXJsKQ0KDQp2ZGVtc19zdWIgPC0gdmRlbXNfc3RhcnQgJT4lIGZpbHRlcih5ZWFyICVpbiUgMjAwMDoyMDEwKQ0KDQojdGliYmxlKGlkID0gMToxODk2KQ0KI3RhYmxlKHZkZW1zX3N1YiRjb3VudHJ5X25hbWUpDQoNCnZkZW0gPC0gdmRlbXNfc3RhcnQgJT4lDQogIGZpbHRlcih5ZWFyICVpbiUgMjAwMDoyMDEwKSAlPiUgDQogIGdyb3VwX2J5KGNvdW50cnlfbmFtZSkgJT4lDQogIHRhbGx5ICU+JQ0KICBtdXRhdGUoY250cnkgPSB1bmlxdWUoY291bnRyeV9uYW1lKSkgJT4lDQogICNEQ0kgVmFyaWFibGVzDQogIG11dGF0ZShkZWxpYjEwID0gdmRlbXNfc3ViICU+JQ0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInYyeGRsX2RlbGliIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKGNvbnN1bHQxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygidjJkbGNvbnNsdCIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShyZWFzb24xMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygidjJkbHJlYXNvbiIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShjb21tb24xMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygidjJkbGNvbW1vbiIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShjb3VudHIxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygidjJkbGNvdW50ciIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShlbmdhZ2UxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygidjJkbGVuZ2FnZSIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShkZWxpYmRlbTEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MnhfZGVsaWJkZW0iKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICAjIENvbnRyb2wgVmFyaWFibGVzDQogIG11dGF0ZShwb2xpdHkxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygiZV9maF9pcG9saXR5MiIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShnZHAxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygiZV9HRFBfUGVyX0NhcF9IYWJlcl9NZW5fMiIpKSAlPiUgI0hJRVIgTcOcU1NURSBNQU4gOCBKQUhSRSBHRFAgYXVzd8OkaGxlbg0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKHJpdzEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJlX3YyeF9yZWdpbWVfY2kiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUoY29yZWNpdmlsMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInYyeGNzX2Njc2kiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUocG9wMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfbWlwb3B1bGEiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUoY29ycnVwdGlvbjEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MnhfY29yciIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShwb2xraWxsMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInYyeF9jbHBoeSIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShlZHVjMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfcGVhdmVkdWMiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUoZ2luaTEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJlX3BlZ2luaXdpIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUgDQogICMgRHVtbXkgdmFyaWFibGVzDQogIG11dGF0ZShwb2xfcm91bmQgPSByb3VuZChwb2xpdHkxMCAqIDIgLTEwKSkgJT4lIA0KICBtdXRhdGUocG9saXR5X2RlbWR1bW15ID0gaWZlbHNlKHBvbF9yb3VuZCA+IDUsIDEsIDApKSAlPiUgDQogIG11dGF0ZShwb2xpdHlfYW5vZHVtbXkgPSBpZmVsc2UocG9sX3JvdW5kID49IC01ICYgcG9sX3JvdW5kIDw9IDUsIDEsIDApKSAlPiUgDQogIG11dGF0ZShwb2xpdHlfYXV0b2R1bW15ID0gaWZlbHNlKHBvbF9yb3VuZCA8IC01LCAxLCAwKSkgJT4lIA0KICBtdXRhdGUocmVnaW1lID0gY2FzZV93aGVuKA0KICAgIHBvbGl0eV9hdXRvZHVtbXkgPT0gMSB+ICJhdXRvIiwNCiAgICBwb2xpdHlfYW5vZHVtbXkgPT0gMSB+ICJhbm8iLA0KICAgIHBvbGl0eV9kZW1kdW1teSA9PSAxIH4gImRlbW8iDQogICAgKQ0KICApICU+JQ0KICBtdXRhdGUocmVnaW1lID0gZmFjdG9yKHJlZ2ltZSwgbGV2ZWxzID0gYygiZGVtbyIsICJhbm8iLCAiYXV0byIpKSkgJT4lIA0KICBtdXRhdGUoY250cnkgPSBjb3VudHJ5Y29kZShjbnRyeSwiY291bnRyeS5uYW1lLmVuIiwiY291bnRyeS5uYW1lLmVuIikpDQoNCnZkZW0kY250cnlbNDBdIDwtICJWaWV0IE5hbSINCg0KDQojIGlmZWxzZShyb3VuZCh2ZGVtJHBvbGl0eTEwICogMiAtMTApID49IC01ICYgcm91bmQodmRlbSRwb2xpdHkxMCAqIDIgLTEwKSA8PSA1LCAxLCAwKQ0KDQp0YWJsZSh2ZGVtJHJlZ2ltZSkNCnByaW50KGxldmVscyh2ZGVtJHJlZ2ltZSkpIA0KDQoNCg0KICANCmBgYA0KDQojIyMgVG8gRG8gLSBSZWdpb25zDQoNCmBgYHtyfQ0KICBtdXRhdGUocmVnaW9ucyA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygiZV9yZWdpb25wb2wiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdCgnMjAwMCcpICU+JSANCiAgICAgICAgICAgbXV0YXRlKHJlZ2lvbnMgPSBmY3RfcmVjb2RlKGFzLmZhY3RvcihgMjAwMGApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRS4gRXVyb3BlIGFuZCBDLiBBc2lhIChwb3N0LUNvbW11bmlzdCkiID0gIjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGF0aW4gQW1lcmljYSAmIENhcnJpYmVhbiIgPSAiMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNRU5BIiA9ICIzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1Yi1TYWhhcmFuIEFmcmljYSIgPSAiNCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXLiBFdXJvcGUgYW5kIE4uIEFtZXJpY2EiID0gIjUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU291dGggJiBFYXN0IEFzaWEgJiBQYWNpZmljIiA9ICI2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoICYgRWFzdCBBc2lhICYgUGFjaWZpYyIgPSAiNyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3V0aCAmIEVhc3QgQXNpYSAmIFBhY2lmaWMiID0gIjgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU291dGggJiBFYXN0IEFzaWEgJiBQYWNpZmljIiA9ICI5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhdGluIEFtZXJpY2EgJiBDYXJyaWJlYW4iID0gIjEwIikgICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc19mYWN0b3IpKSAgJT4lDQogICAgICAgICAgIHNlbGVjdChyZWdpb25zKQ0KDQoNCnRhYmxlKHJlZ2lvbnMpDQoNCnJlZ2lvbnMyIDwtIHZkZW1zX3N1YiAlPiUgDQogIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICB2YWx1ZS52YXI9YygiZV9yZWdpb25wb2wiKSkgJT4lDQogIHNlbGVjdCgnMjAwMCcpICU+JSANCiAgdHJhbnNtdXRlKGZjdF9yZWNvZGUoYXMuZmFjdG9yKGAyMDAwYCksDQogICAgICAgICAgICAgICAgICAgICAgICJFLiBFdXJvcGUgYW5kIEMuIEFzaWEgKHBvc3QtQ29tbXVuaXN0KSIgPSAiMSIsDQogICAgICAgICAgICAgICAgICAgICAgICJMYXRpbiBBbWVyaWNhICYgQ2FycmliZWFuIiA9ICIyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIk1FTkEiID0gIjMiLA0KICAgICAgICAgICAgICAgICAgICAgICAiU3ViLVNhaGFyYW4gQWZyaWNhIiA9ICI0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlcuIEV1cm9wZSBhbmQgTi4gQW1lcmljYSIgPSAiNSIsDQogICAgICAgICAgICAgICAgICAgICAgICJFYXN0IEFzaWEiID0gIjYiLA0KICAgICAgICAgICAgICAgICAgICAgICAiU291dGgtRWFzdCBBc2lhIiA9ICI3IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoIEFzaWEiID0gIjgiLA0KICAgICAgICAgICAgICAgICAgICAgICAiUGFjaWZpYyIgPSAiOSIsDQogICAgICAgICAgICAgICAgICAgICAgICJMYXRpbiBBbWVyaWNhICYgQ2FycmliZWFuIiA9ICIxMCIpKQ0KDQp0YWJsZShyZWdpb25zMikNCg0KcmVnaW9uczMgPC0gZGNhc3QodmRlbXNfc3ViLCBjb3VudHJ5X25hbWUgfiB5ZWFyLCB2YWx1ZS52YXI9YygiZV9yZWdpb25wb2wiKSkkIjIwMDAiDQoNCnBvc3Rjb20gICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDEpDQpsYXRpbiAgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSAyIHwgcmVnaW9uczMgPT0gMTApDQptZW5hICAgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSAzKQ0Kc3Vic2FoYXJhIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gNCkNCndlc3QgICAgICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDUpDQplLmFzaWEgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA2KQ0Kcy5lLmFzaWEgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gNykNCnMuYXNpYSAgICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDgpDQpwYWNpZmljICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA5KQ0KDQoNCnd3IDwtIHZkZW1zX3N1YiAlPiUgDQogIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygiZV9yZWdpb25wb2wiKSkgJT4lDQogIHNlbGVjdCgnMjAwMCcpICU+JSANCiAgbXV0YXRlKHJlZ2lvbnMgPSBmY3RfcmVjb2RlKGFzLmZhY3RvcihgMjAwMGApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRS4gRXVyb3BlIGFuZCBDLiBBc2lhIChwb3N0LUNvbW11bmlzdCkiID0gIjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGF0aW4gQW1lcmljYSAmIENhcnJpYmVhbiIgPSAiMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNRU5BIiA9ICIzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1Yi1TYWhhcmFuIEFmcmljYSIgPSAiNCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXLiBFdXJvcGUgYW5kIE4uIEFtZXJpY2EiID0gIjUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU291dGggJiBFYXN0IEFzaWEgJiBQYWNpZmljIiA9ICI2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoICYgRWFzdCBBc2lhICYgUGFjaWZpYyIgPSAiNyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3V0aCAmIEVhc3QgQXNpYSAmIFBhY2lmaWMiID0gIjgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU291dGggJiBFYXN0IEFzaWEgJiBQYWNpZmljIiA9ICI5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhdGluIEFtZXJpY2EgJiBDYXJyaWJlYW4iID0gIjEwIikpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNfZmFjdG9yKCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QocmVnaW9ucykNCg0Kd3cNCg0KcmVnaW9uczIgPC0gdmRlbXNfc3ViICU+JSANCiAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgIHZhbHVlLnZhcj1jKCJlX3JlZ2lvbnBvbCIpKSAlPiUNCiAgc2VsZWN0KCcyMDAwJykgJT4lIA0KICB0cmFuc211dGUoZmN0X3JlY29kZShhcy5mYWN0b3IoYDIwMDBgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIkUuIEV1cm9wZSBhbmQgQy4gQXNpYSAocG9zdC1Db21tdW5pc3QpIiA9ICIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIkxhdGluIEFtZXJpY2EgJiBDYXJyaWJlYW4iID0gIjIiLA0KICAgICAgICAgICAgICAgICAgICAgICAiTUVOQSIgPSAiMyIsDQogICAgICAgICAgICAgICAgICAgICAgICJTdWItU2FoYXJhbiBBZnJpY2EiID0gIjQiLA0KICAgICAgICAgICAgICAgICAgICAgICAiVy4gRXVyb3BlIGFuZCBOLiBBbWVyaWNhIiA9ICI1IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIkVhc3QgQXNpYSIgPSAiNiIsDQogICAgICAgICAgICAgICAgICAgICAgICJTb3V0aC1FYXN0IEFzaWEiID0gIjciLA0KICAgICAgICAgICAgICAgICAgICAgICAiU291dGggQXNpYSIgPSAiOCIsDQogICAgICAgICAgICAgICAgICAgICAgICJQYWNpZmljIiA9ICI5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIkxhdGluIEFtZXJpY2EgJiBDYXJyaWJlYW4iID0gIjEwIikpDQoNCnRhYmxlKHJlZ2lvbnMyKQ0KDQpyZWdpb25zMyA8LSBkY2FzdCh2ZGVtc19zdWIsIGNvdW50cnlfbmFtZSB+IHllYXIsIHZhbHVlLnZhcj1jKCJlX3JlZ2lvbnBvbCIpKSQiMjAwMCINCg0KcG9zdGNvbSAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gMSkNCmxhdGluICAgICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDIgfCByZWdpb25zMyA9PSAxMCkNCm1lbmEgICAgICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDMpDQpzdWJzYWhhcmEgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA0KQ0Kd2VzdCAgICAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gNSkNCmUuYXNpYSAgICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDYpDQpzLmUuYXNpYSAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA3KQ0Kcy5hc2lhICAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gOCkNCnBhY2lmaWMgICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDkpDQoNCg0KDQpgYGANCg0KDQojIyBRb0cNCg0KYGBge3J9DQpsb2FkKHFvZ191cmwpDQoNCnFvZzEwIDwtIHFvZyAlPiUgDQogIGZpbHRlcih5ZWFyICVpbiUgMjAwMDoyMDEwKSAlPiUgDQogIG11dGF0ZShjbnRyeSA9IGNvdW50cnljb2RlKGNjb2RlY293LCAiY293biIsImNvdW50cnkubmFtZS5lbiIpKQ0KDQpxb2cxMCA8LSBxb2cgJT4lIA0KICBmaWx0ZXIoeWVhciAlaW4lIDIwMDA6MjAxMCkgJT4lIA0KICBtdXRhdGUoY250cnkgPSBjb3VudHJ5Y29kZShjY29kZWNvdywgImNvd24iLCJjb3VudHJ5Lm5hbWUuZW4iKSkgJT4lIA0KICBncm91cF9ieShjbnRyeSkgJT4lDQogIHRhbGx5KCkgJT4lIA0KICBtdXRhdGUoZXRobmljMTAgPSBxb2cxMCAlPiUNCiAgICAgICAgICAgZGNhc3QoY250cnkgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImFsX2V0aG5pYyIpLCANCiAgICAgICAgICBmdW4uYWdncmVnYXRlID0gbWVhbikgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JSANCiAgc2VsZWN0KC1uKQ0KIyAgbXV0YXRlKGFsX2V0aG5pYyA9IGFzLm51bWVyaWMoYWxfZXRobmljKSkgJT4lIA0KDQpxb2cxMA0KDQoNCg0KYGBgDQoNCiMjIE1lcmdpbmcgVGltZQ0KDQojIyMgTGV2ZWwgMg0KDQpgYGB7cn0NCmxldmVsMiA8LSBtZXJnZSh4PXFvZzEwLCB5PXZkZW0sIGJ5PSJjbnRyeSIpDQoNCmxldmVsMg0KYGBgDQoNCiMjIyBJbmQgKyBDb3VudHJ5DQoNCmBgYHtyfQ0KDQpjb21iaW5lZCA8LSBtZXJnZSh4PW1lcmdlZCwgeT1sZXZlbDIsIGJ5PSJjbnRyeSIpICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGNudHJ5ZWFycyA9IHBhc3RlKGNudHJ5LCB5ZWFyKSkNCg0KI2NvbWJpbmVkJGNudHJ5ZWFycyA8LSBwYXN0ZShjb21iaW5lZCRjbnRyeSxjb21iaW5lZCR5ZWFyKQ0KDQoNCnZkZW0yIDwtIHZkZW1zX3N0YXJ0ICU+JQ0KICBmaWx0ZXIoeWVhciAlaW4lIDIwMTA6MjAxNSkgJT4lIA0KICBtdXRhdGUoY250cnkgPSBjb3VudHJ5Y29kZShjb3VudHJ5X25hbWUsImNvdW50cnkubmFtZS5lbiIsImNvdW50cnkubmFtZS5lbiIpKSAjJT4lIA0KICMgc2VsZWN0KGNudHJ5LCBjb3VudHJ5X25hbWUpDQoNCnZkZW0yJGNudHJ5Wzk5Nl0gPC0gIlZpZXQgTmFtIg0KdmRlbTIkY250cnlbOTk3XSA8LSAiVmlldCBOYW0iDQp2ZGVtMiRjbnRyeVs5OThdIDwtICJWaWV0IE5hbSINCnZkZW0yJGNudHJ5Wzk5OV0gPC0gIlZpZXQgTmFtIg0KdmRlbTIkY250cnlbMTAwMF0gPC0gIlZpZXQgTmFtIg0KdmRlbTIkY250cnlbMTAwMV0gPC0gIlZpZXQgTmFtIg0KDQpjb21iaW5lZCA8LSB2ZGVtMiAlPiUgDQogIG11dGF0ZShjbnRyeWVhcnMgPSBwYXN0ZShjbnRyeSwgeWVhcikpICU+JSANCiAgbXV0YXRlKGRpc2N1c3NfdW5zZWwgPSB2MnhjbF9kaXNjKSAlPiUgDQogIHNlbGVjdChjbnRyeWVhcnMsIGRpc2N1c3NfdW5zZWwpICU+JSANCiAgbWVyZ2UoY29tYmluZWQsIGJ5ID0gImNudHJ5ZWFycyIpICU+JSANCiAgICAgICAgICAgICAgICAgIHBseXI6OmRkcGx5KH5jbnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZSwgDQogICAgICAgICAgICAgICAgICAgICAgICBkaXNjdXNzID0gbWVhbihkaXNjdXNzX3Vuc2VsLCBuYS5ybT1UKSkgJT4lIA0KICBtZXJnZShjb21iaW5lZCwgYnkgPSAiY250cnkiKQ0KDQoNCmNvbWJpbmVkDQoNCg0Kc2F2ZShjb21iaW5lZCxmaWxlPSJjb21iaW5lZC5SZGF0YSIpDQpzYXZlKGxldmVsMixmaWxlPSJsZXZlbDIuUmRhdGEiKQ0KYGBgDQoNCg0KIyBXZWlnaHRpbmcNCg0KIyMgTWFjcm8gTGV2ZWwNCg0KYGBge3J9DQoNCm1hY3JvICA8LSBjb21iaW5lZCAlPiUgDQogICAgICAgICAgICAgICAgbXV0YXRlKGdvdl90cnVzdCA9IHJhbmdlMDEoZ292X3RydXN0KSoxMDApICU+JSANCiAgICAgICAgICAgICAgICBtdXRhdGUoZGVtdG9kYXkgPSByYW5nZTAxKGRlbXRvZGF5KSoxMDApICU+JSANCiAgICAgICAgICAgICAgICBwbHlyOjpkZHBseSh+Y250cnksDQogICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UsDQogICAgICAgICAgICAgICAgICAgICBtZWFuX2dvdiA9IG1lYW4oZ292X3RydXN0LCBuYS5ybT1UKSwNCiAgICAgICAgICAgICAgICAgICAgIG1lYW5fZGVtID0gbWVhbihkZW10b2RheSwgbmEucm09VCksDQogICAgICAgICAgICAgICAgICAgICBkaXNjdXNzID0gbWVhbihkaXNjdXNzLCBuYS5ybT1UKSkgJT4lIA0KIyAgICAgICAgICAgICAgICAgICAgIHBvbGl0eTEwID0gbWVhbihwb2xpdHkxMCwgbmEucm09VCksDQojICAgICAgICAgICAgICAgICAgICAgcG9saXR5X2RlbWR1bW15ID0gbWVhbihwb2xpdHlfZGVtZHVtbXksIG5hLnJtPVQpKSAlPiUgDQogICAgICAgICAgICAgICAgbXV0YXRlKGRpc2N1c3Nfcm91bmQgPSByb3VuZChkaXNjdXNzKjQpKSAlPiUgDQogICAgICAgICAgICAgICAgbXV0YXRlKG1lYW5fZ292X2xvdyA9IGNhc2Vfd2hlbigNCiAgICAgICAgICAgICAgICAgICAgICBkaXNjdXNzX3JvdW5kID09IDIgfiBtZWFuX2dvdiAqIC45LA0KICAgICAgICAgICAgICAgICAgICAgIGRpc2N1c3Nfcm91bmQgPT0gMSB+IG1lYW5fZ292ICogLjg1LA0KICAgICAgICAgICAgICAgICAgICAgIGRpc2N1c3Nfcm91bmQgJWluJSBjKDMsNCkgfiBtZWFuX2dvdikpICU+JSANCiAgICAgICAgICAgICAgICBtdXRhdGUobWVhbl9nb3ZfaGlnaCA9IGNhc2Vfd2hlbigNCiAgICAgICAgICAgICAgICAgICAgICBkaXNjdXNzX3JvdW5kID09IDIgfiBtZWFuX2dvdiAqIC44LA0KICAgICAgICAgICAgICAgICAgICAgIGRpc2N1c3Nfcm91bmQgPT0gMSB+IG1lYW5fZ292ICogLjc1LA0KICAgICAgICAgICAgICAgICAgICAgIGRpc2N1c3Nfcm91bmQgJWluJSBjKDMsNCkgfiBtZWFuX2dvdikpICU+JSANCiAgICAgICAgICAgICAgICBtZXJnZShsZXZlbDIsIGJ5ID0gImNudHJ5IikgJT4lIA0KICAgICAgICAgICAgICAgIG11dGF0ZV9hdCh2YXJzKGNvbW1vbjEwLCByZWFzb24xMCwgY29uc3VsdDEwLCANCiAgICAgICAgICAgICAgICAgY291bnRyMTAsIGVuZ2FnZTEwLCBlbmdhZ2UxMCwgZGVsaWIxMCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UwMSkNCg0KbWFjcm9fZGVtIDwtIG1hY3JvICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIocG9saXR5X2RlbWR1bW15ID09IDEpDQoNCm1hY3JvX2F1dCA8LSBtYWNybyAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHBvbGl0eV9kZW1kdW1teSA9PSAwKQ0KDQojIHRhYmxlX3N0dWZmMjwtc3Vic2V0KHRhYmxlX3N0dWZmLA0KIyAgICAgICAgICAgICAgICAgICAgICAhaXMubmEodGFibGVfc3R1ZmYkcmVnaW1lKSAmDQojICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVfc3R1ZmYkY250cnkhPSJRYXRhciIgJg0KIyAgICAgICAgICAgICAgICAgICAgICAgdGFibGVfc3R1ZmYkY250cnkhPSJVemJla2lzdGFuIikNCg0KDQpzYXZlKG1hY3JvLCBmaWxlPSJtYWNyby5SZGF0YSIpDQpzYXZlKG1hY3JvX2RlbSwgZmlsZT0ibWFjcm9fZGVtLlJkYXRhIikNCnNhdmUobWFjcm9fYXV0LCBmaWxlPSJtYWNyb19hdXQuUmRhdGEiKQ0KDQpgYGANCg0KIyMgSW5kaXZpZHVhbCBMZXZlbA0KDQpgYGB7cn0NCmNvbWJpbmVkICA8LSBjb21iaW5lZCAlPiUgDQogICAgICAgICAgICAgICAgbXV0YXRlKGRpc2N1c3Nfcm91bmQgPSByb3VuZChkaXNjdXNzKjQpKSAlPiUgDQogICAgICAgICAgICAgICAgbXV0YXRlKGdvdl90cnVzdF9sb3cgPSBjYXNlX3doZW4oDQogICAgICAgICAgICAgICAgICAgICAgZGlzY3Vzc19yb3VuZCA9PSAyIH4gZ292X3RydXN0ICogLjksDQogICAgICAgICAgICAgICAgICAgICAgZGlzY3Vzc19yb3VuZCA9PSAxIH4gZ292X3RydXN0ICogLjg1LA0KICAgICAgICAgICAgICAgICAgICAgIGRpc2N1c3Nfcm91bmQgJWluJSBjKDMsNCkgfiBnb3ZfdHJ1c3QpKSAlPiUgDQogICAgICAgICAgICAgICAgbXV0YXRlKGdvdl90cnVzdF9oaWdoID0gY2FzZV93aGVuKA0KICAgICAgICAgICAgICAgICAgICAgIGRpc2N1c3Nfcm91bmQgPT0gMiB+IGdvdl90cnVzdCAqIC44LA0KICAgICAgICAgICAgICAgICAgICAgIGRpc2N1c3Nfcm91bmQgPT0gMSB+IGdvdl90cnVzdCAqIC43NSwNCiAgICAgICAgICAgICAgICAgICAgICBkaXNjdXNzX3JvdW5kICVpbiUgYygzLDQpIH4gZ292X3RydXN0KSkgJT4lIA0KICAgICAgICAgICAgICAgIG11dGF0ZV9hdCh2YXJzKGNvbW1vbjEwLCByZWFzb24xMCwgY29uc3VsdDEwLCANCiAgICAgICAgICAgICAgICAgY291bnRyMTAsIGVuZ2FnZTEwLCBlbmdhZ2UxMCwgZGVsaWIxMCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UwMSkNCg0Kc2F2ZShjb21iaW5lZCxmaWxlPSJjb21iaW5lZC5SZGF0YSIpDQoNCmBgYA0KDQoNCiMgQ3JhcA0KDQpgYGB7cn0NCg0KY29tcGFyZV9jbnRyeTwtZGF0YS5mcmFtZSh0YWJsZShtZXJnZWQkY250cnksbWVyZ2VkJHllYXIpKQ0KY29tcGFyZV9jbnRyeTwtdGlkeXI6OnNwcmVhZChjb21wYXJlX2NudHJ5LFZhcjIsRnJlcSkNCmNvbXBhcmVfY250cnlbY29tcGFyZV9jbnRyeT09MF08LTEwMDAwMA0KI2NvbXBhcmVfY250cnk8LW5hLm9taXQoY29tcGFyZV9jbnRyeSkNCmluZGllPC1hcy5udW1lcmljKGFwcGx5KGNvbXBhcmVfY250cnlbLC0xXSwxLHN1bSkpDQpjb21wYXJlX2NudHJ5JGRvdWJsZTwtaW5kaWU8OTAwMDAwDQpjb21wYXJlX2NudHJ5W2NvbXBhcmVfY250cnk9PTEwMDAwMF08LTANCmNvbXBhcmVfY250cnkyIDwtIHN1YnNldChjb21wYXJlX2NudHJ5LGNvbXBhcmVfY250cnkkZG91YmxlPT1UUlVFKQ0KDQpjb21wYXJlX2NudHJ5MyA8LSBzdWJzZXQobWVyZ2VkLG1lcmdlZCRjbnRyeSAlaW4lIGNvbXBhcmVfY250cnkyJFZhcjEpDQoNCnkxPC1zdWJzZXQoY29tcGFyZV9jbnRyeTMsY29tcGFyZV9jbnRyeTMkY250cnk9PSJCZWxpemUiICYNCiAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlX2NudHJ5MyR5ZWFyPT0yMDEyKSRnb3ZfdHJ1c3QNCg0KeTI8LXN1YnNldChjb21wYXJlX2NudHJ5Myxjb21wYXJlX2NudHJ5MyRjbnRyeT09IkJlbGl6ZSIgJg0KICAgICAgICAgY29tcGFyZV9jbnRyeTMkeWVhcj09MjAxNCkkZ292X3RydXN0DQoNCnQudGVzdCh5MSx5MikNCg0KeTE8LXN1YnNldChjb21wYXJlX2NudHJ5Myxjb21wYXJlX2NudHJ5MyRjbnRyeT09IkJvbGl2aWEgKFBsdXJpbmF0aW9uYWwgU3RhdGUgb2YpIiAmDQogICAgICAgICAgICAgY29tcGFyZV9jbnRyeTMkeWVhcj09MjAxMikkZ292X3RydXN0DQoNCnkyPC1zdWJzZXQoY29tcGFyZV9jbnRyeTMsY29tcGFyZV9jbnRyeTMkY250cnk9PSJCb2xpdmlhIChQbHVyaW5hdGlvbmFsIFN0YXRlIG9mKSIgJg0KICAgICAgICAgICAgIGNvbXBhcmVfY250cnkzJHllYXI9PTIwMTMpJGdvdl90cnVzdA0KDQp0LnRlc3QoeTEseTIpDQoNCnkxPC1zdWJzZXQoY29tcGFyZV9jbnRyeTMsY29tcGFyZV9jbnRyeTMkY250cnk9PSJTb3V0aCBBZnJpY2EiICYNCiAgICAgICAgICAgICBjb21wYXJlX2NudHJ5MyR5ZWFyPT0yMDExKSRnb3ZfdHJ1c3QNCg0KeTI8LXN1YnNldChjb21wYXJlX2NudHJ5Myxjb21wYXJlX2NudHJ5MyRjbnRyeT09IlNvdXRoIEFmcmljYSIgJg0KICAgICAgICAgICAgIGNvbXBhcmVfY250cnkzJHllYXI9PTIwMTMpJGdvdl90cnVzdA0KDQp0LnRlc3QoeTEseTIpDQoNCiAgICAgICANCnN1YnNldChtZXJnZWQsbWVyZ2VkJHllYXI9PTIwMTIpDQoNCmxpYnJhcnkoZHBseXIpDQpjb21wYXJlX2NudHJ5NCA8LSBjb21wYXJlX2NudHJ5MyAlPiUNCiAgZ3JvdXBfYnkoY250cnkseWVhcikgJT4lDQogIHN1bW1hcmlzZV9hbGwoZnVucyhtZWFuKC4sIG5hLnJtPVRSVUUpKSkNCg0KY29tcGFyZV9jbnRyeTQkY250cnllYXI8LXBhc3RlKGNvbXBhcmVfY250cnk0JGNudHJ5LGNvbXBhcmVfY250cnk0JHllYXIpDQogIA0KYXMuZGF0YS5mcmFtZShjb21wYXJlX2NudHJ5NFssYygxNyw4KV0pDQogIA0KP2RkcGx5DQpoZWFkKGFmcm8pDQoNCmFmcm9jbnRyeTwtdW5pcXVlKGFmcm8kY250cnkpDQpsYXRpbm9jbnRyeTwtdW5pcXVlKGxhdGlubzIwMTMkY250cnkpDQphcmFiY250cnk8LXVuaXF1ZShhcmFiMyRjbnRyeSkNCnd2c2NudHJ5PC11bmlxdWUod3ZzJGNudHJ5KQ0KDQpjbnRyeV90YWJsZTwtIGRhdGEuZnJhbWUoYXMuY2hhcmFjdGVyKHd2c2NudHJ5KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBjKGFzLmNoYXJhY3RlcihhcmFiY250cnkpLHJlcCgiLSIsNDgpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBjKGFzLmNoYXJhY3RlcihsYXRpbm9jbnRyeSkscmVwKCItIiw0MSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGMoYXMuY2hhcmFjdGVyKGFmcm9jbnRyeSkscmVwKCItIiwyNCkpKQ0KDQpjb2xuYW1lcyhjbnRyeV90YWJsZSkgPC0gYygid3ZzIiwiYXJhYiIsImxhdGlubyIsImFmcm8iKQ0KDQphcnJhbmdlKGNudHJ5X3RhYmxlLCB3dnMsIGFmcm8pDQoNCg0KDQp0YWJsZShjb21iaW5lZCRwb2xpdGNhdC54KQ0KbXBsdXNkYXRhIDwtIGNvbWJpbmVkICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LCBkZWxpYjEwLCBkZW10b2RheSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsdHJ1c3RfY291cnRzLHdlaWdodCkNCm1wbHVzZGF0YSA8LSBuYS5vbWl0KG1wbHVzZGF0YSkNCm1wbHVzZGF0YSRjbnRyeSA8LSBhcy5udW1lcmljKG1wbHVzZGF0YSRjbnRyeSkNCndyaXRlX2NzdihtcGx1c2RhdGEsIHBhdGggPSAibXBsdXNkYXRhLmNzdiIsIGNvbF9uYW1lcyA9IEYpDQoNCm1wbHVzZGF0YTIgPC0gY29tYmluZWQgJT4lIGRwbHlyOjpzZWxlY3QoY250cnksIGRlbGliMTAsIGRlbXRvZGF5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3ZfdHJ1c3Qsd2VpZ2h0KQ0KbXBsdXNkYXRhMiA8LSBuYS5vbWl0KG1wbHVzZGF0YTIpDQptcGx1c2RhdGEyJGNudHJ5IDwtIGFzLm51bWVyaWMobXBsdXNkYXRhMiRjbnRyeSkNCndyaXRlX2NzdihtcGx1c2RhdGEyLCBwYXRoID0gIm1wbHVzZGF0MmEuY3N2IiwgY29sX25hbWVzID0gRikNCg0KbXBsdXNkYXRhMl9kZW0gPC0gY29tYmluZWRfZGVtICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LCBkZWxpYjEwLCBkZW10b2RheSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdl90cnVzdCx3ZWlnaHQpDQptcGx1c2RhdGEyX2RlbSA8LSBuYS5vbWl0KG1wbHVzZGF0YTJfZGVtKQ0KbXBsdXNkYXRhMl9kZW0kY250cnkgPC0gYXMubnVtZXJpYyhtcGx1c2RhdGEyX2RlbSRjbnRyeSkNCndyaXRlX2NzdihtcGx1c2RhdGEyX2RlbSwgcGF0aCA9ICJtcGx1c2RhdDJfZGVtYS5jc3YiLCBjb2xfbmFtZXMgPSBGKQ0KDQptcGx1c2RhdGEyX2F1dCA8LSBjb21iaW5lZF9hdXQgJT4lIGRwbHlyOjpzZWxlY3QoY250cnksIGRlbGliMTAsIGRlbXRvZGF5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ292X3RydXN0LHdlaWdodCkNCm1wbHVzZGF0YTJfYXV0IDwtIG5hLm9taXQobXBsdXNkYXRhMl9hdXQpDQptcGx1c2RhdGEyX2F1dCRjbnRyeSA8LSBhcy5udW1lcmljKG1wbHVzZGF0YTJfYXV0JGNudHJ5KQ0Kd3JpdGVfY3N2KG1wbHVzZGF0YTJfYXV0LCBwYXRoID0gIm1wbHVzZGF0Ml9hdXRhLmNzdiIsIGNvbF9uYW1lcyA9IEYpDQoNCmNvbWJpbmVkIDwtIG1lcmdlKGNvbWJpbmVkLCBwaHlzaTJfcywgYnkgPSAiY250cnkiKQ0KDQpjb21iaW5lZF9kZW0gPC0gc3Vic2V0KGNvbWJpbmVkLGNvbWJpbmVkJHBvbGl0eV9kZW1kdW1teT09MSkNCg0KbXBsdXNkYXRhX2RlbSA8LSBjb21iaW5lZF9kZW0gJT4lIGRwbHlyOjpzZWxlY3QoY250cnksIGRlbGliMTAsIGRlbXRvZGF5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSx0cnVzdF9jb3VydHMsd2VpZ2h0KQ0KbXBsdXNkYXRhX2RlbSA8LSBuYS5vbWl0KG1wbHVzZGF0YV9kZW0pDQptcGx1c2RhdGFfZGVtJGNudHJ5IDwtIGFzLm51bWVyaWMobXBsdXNkYXRhX2RlbSRjbnRyeSkNCndyaXRlX2NzdihtcGx1c2RhdGFfZGVtLCBwYXRoID0gIm1wbHVzZGF0YV9kZW0uY3N2IiwgY29sX25hbWVzID0gRikNCg0KDQpjb21iaW5lZF9hdXQgPC0gc3Vic2V0KGNvbWJpbmVkLGNvbWJpbmVkJHBvbGl0eV9kZW1kdW1teT09MCkNCg0KbXBsdXNkYXRhX2F1dCA8LSBjb21iaW5lZF9hdXQgJT4lIGRwbHlyOjpzZWxlY3QoY250cnksIGRlbGliMTAsIGRlbXRvZGF5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsdHJ1c3RfY291cnRzLHdlaWdodCkNCm1wbHVzZGF0YV9hdXQgPC0gbmEub21pdChtcGx1c2RhdGFfYXV0KQ0KbXBsdXNkYXRhX2F1dCRjbnRyeSA8LSBhcy5udW1lcmljKG1wbHVzZGF0YV9hdXQkY250cnkpDQp3cml0ZV9jc3YobXBsdXNkYXRhX2F1dCwgcGF0aCA9ICJtcGx1c2RhdGFfYXV0LmNzdiIsIGNvbF9uYW1lcyA9IEYpDQoNCg0KI2RhdGFfd2lkcyA8LSBkY2FzdChtZXJnZWQsIGNudHJ5fnllYXIsIA0KIyAgICAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInllYXIiKSkNCiNkYXRhX3dpZHMyIDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KGRhdGFfd2lkc1ssLTFdLGZ1bmN0aW9uKG4pIDA8bikpDQojZGF0YV93aWRzMyA8LSBhcy5kYXRhLmZyYW1lKGFwcGx5KGRhdGFfd2lkczIsMixhcy5udW1lcmljKSkNCiNkYXRhX3dpZHMzIDwtIGNiaW5kKGRhdGFfd2lkc1ssMV0sZGF0YV93aWRzMykNCiNuYW1lcyhkYXRhX3dpZHMzKVsxXTwtImNudHJ5Ig0KI3RhYmxlX3N0dWZmIDwtIG1lcmdlKGRhdGFfd2lkczMgLHRhYmxlX3N0dWZmLCBieT0iY250cnkiKQ0KDQojdGFibGVfc3R1ZmYkcG9saXR5MTBbdGFibGVfc3R1ZmYkY250cnk9PSJUdW5pc2lhIl0gPC0gNS4zMjM4Mg0KI3RhYmxlX3N0dWZmMiRwb2xpdHkxMFt0YWJsZV9zdHVmZjIkY250cnk9PSJUdW5pc2lhIl0gPC0gNS4zMjM4Mg0KDQpoZWFkKHRhYmxlX3N0dWZmKQ0KY29yKG5hLm9taXQoZGF0YS5mcmFtZSh0YWJsZV9zdHVmZiRsZWdpdCx0YWJsZV9zdHVmZiRsZWdpdDIsdGFibGVfc3R1ZmYkbGVnaXQzLA0KICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9zdHVmZiRtZWFuX2dvdikpKQ0KDQp0YWJsZV9zdHVmZiRnbmkgPC0gdGFibGVfc3R1ZmYkZ25pX2MNCg0KdGFibGVfc3R1ZmYkZ25pX2NbdGFibGVfc3R1ZmYkZ25pIDw9IDEwMjVdIDwtICJsb3ciDQp0YWJsZV9zdHVmZiRnbmlfY1t0YWJsZV9zdHVmZiRnbmkgPiAxMDI2ICYgdGFibGVfc3R1ZmYkZ25pIDw9IDQwMzVdIDwtICJsb3dlci1taWRkbGUiDQp0YWJsZV9zdHVmZiRnbmlfY1t0YWJsZV9zdHVmZiRnbmkgPiA0MDM2ICYgdGFibGVfc3R1ZmYkZ25pIDw9IDEyNDc1XSA8LSAidXBwZXItbWlkZGxlIg0KdGFibGVfc3R1ZmYkZ25pX2NbdGFibGVfc3R1ZmYkZ25pID4gMTI0NzVdIDwtICJoaWdoIg0KDQp0YWJsZV9zdHVmZiRnbmlfYzIgPC0gdGFibGVfc3R1ZmYkZ25pX2MNCg0KdGFibGVfc3R1ZmYkZ25pX2MyW3RhYmxlX3N0dWZmJGduaV9jID09ICJsb3dlci1taWRkbGUiXSA8LSAibG93Ig0KdGFibGVfc3R1ZmYkZ25pX2MyW3RhYmxlX3N0dWZmJGduaV9jID09ICJ1cHBlci1taWRkbGUiXSA8LSAiaGlnaCINCg0KdGFibGUodGFibGVfc3R1ZmYkZ25pX2MpDQp0YWJsZSh0YWJsZV9zdHVmZiRnbmlfYzIpDQoNClRoZSBjdXQtb2ZmIHBvaW50cyBhcmUgSERJIG9mIGxlc3MgdGhhbiAwLjU1MA0KZm9yIGxvdyBodW1hbiBkZXZlbG9wbWVudCwgMC41NTAtMC42OTkgZm9yIG1lZGl1bSBodW1hbg0KZGV2ZWxvcG1lbnQsIDAuNzAwLTAuNzk5IGZvciBoaWdoIGh1bWFuIGRldmVsb3BtZW50IGFuZA0KMC44MDAgb3IgZ3JlYXRlciBmb3IgdmVyeSBoaWdoIGh1bWFuIGRldmVsb3BtZW50Lg0KDQojdGFibGVfc3R1ZmYkaGRpX2MgPC0gdGFibGVfc3R1ZmYkaGRpDQoNCiN0YWJsZV9zdHVmZiRoZGlfY1t0YWJsZV9zdHVmZiRoZGkgPCAwLjU1MF0gPC0gImxvdyINCiN0YWJsZV9zdHVmZiRoZGlfY1t0YWJsZV9zdHVmZiRoZGkgPj0gMC41NTAgJiB0YWJsZV9zdHVmZiRoZGkgPD0gMC42OTldIDwtICJtZWRpdW0iDQojdGFibGVfc3R1ZmYkaGRpX2NbdGFibGVfc3R1ZmYkaGRpID49IDAuNzAwICYgdGFibGVfc3R1ZmYkaGRpIDw9IDAuODk5XSA8LSAiaGlnaCINCiN0YWJsZV9zdHVmZiRoZGlfY1t0YWJsZV9zdHVmZiRoZGkgPj0gMC45MF0gPC0gInZlcnkgaGlnaCINCg0KI3RhYmxlKHRhYmxlX3N0dWZmJGhkaV9jKQ0KDQoNCg0KdGFibGUocm91bmQodGFibGVfc3R1ZmYkdGVycm9yKSkNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3YyIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjJbaXMubmEodGFibGVfc3R1ZmYkbWVhbl9nb3YyKV08LTk5OQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjMgPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YNCnRhYmxlX3N0dWZmJG1lYW5fZ292M1tpcy5uYSh0YWJsZV9zdHVmZiRtZWFuX2dvdjMpXTwtOTk5DQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292NCA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y0W2lzLm5hKHRhYmxlX3N0dWZmJG1lYW5fZ292NCldPC05OTkNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y1IDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjVbaXMubmEodGFibGVfc3R1ZmYkbWVhbl9nb3Y1KV08LTk5OQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjYgPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YNCnRhYmxlX3N0dWZmJG1lYW5fZ292Nltpcy5uYSh0YWJsZV9zdHVmZiRtZWFuX2dvdjYpXTwtOTk5DQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292NyA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y3W2lzLm5hKHRhYmxlX3N0dWZmJG1lYW5fZ292NyldPC05OTkNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y4IDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjhbaXMubmEodGFibGVfc3R1ZmYkbWVhbl9nb3Y4KV08LTk5OQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjkgPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YNCnRhYmxlX3N0dWZmJG1lYW5fZ292OVtpcy5uYSh0YWJsZV9zdHVmZiRtZWFuX2dvdjkpXTwtOTk5DQoNCnRhYmxlX3N0dWZmJHBoeXN2aW9sMiA8LSB0YWJsZV9zdHVmZiRwaHlzdmlvbA0KdGFibGVfc3R1ZmYkcGh5c3Zpb2wyW2lzLm5hKHRhYmxlX3N0dWZmJHBoeXN2aW9sMildIDwtIDk5OQ0KDQp0YWJsZV9zdHVmZiR0ZXJyb3IyIDwtIHJvdW5kKHRhYmxlX3N0dWZmJHRlcnJvcikNCnRhYmxlX3N0dWZmJHRlcnJvcjJbaXMubmFuKHRhYmxlX3N0dWZmJHRlcnJvcjIpXSA8LSA5OTkNCg0KdGFibGVfc3R1ZmYkZGlzY3VzczIgPC0gcm91bmQodGFibGVfc3R1ZmYkZGlzY3Vzcyo0KQ0KdGFibGVfc3R1ZmYkZGlzY3VzczJbaXMubmFuKHRhYmxlX3N0dWZmJGRpc2N1c3MyKV0gPC0gOTk5DQoNCg0KDQp0YWJsZSh0YWJsZV9zdHVmZiRwaHlzdmlvbCkNCnRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuNSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjRdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuNSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjRdLTUNCnRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuNCAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjNdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuNCAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjNdLTEwDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjJbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjMgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4yXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjJbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjMgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4yXS0xNQ0KdGFibGVfc3R1ZmYkbWVhbl9nb3YyW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC4yICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuMV0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YyW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC4yICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuMV0tMjANCnRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj49MF0gIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj49MF0gIC0yNQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjJbdGFibGVfc3R1ZmYkbWVhbl9nb3YyPjEwMF0gPC0gTkENCnRhYmxlKHRhYmxlX3N0dWZmJG1lYW5fZ292MikNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3YzW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC41ICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuNF0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YzW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC41ICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuNF0tOA0KdGFibGVfc3R1ZmYkbWVhbl9nb3YzW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC40ICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuM10gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YzW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC40ICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuM10tMTYNCnRhYmxlX3N0dWZmJG1lYW5fZ292M1t0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMyAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjJdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292M1t0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMyAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjJdLTI0DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjNbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjIgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4xXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjNbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjIgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4xXSAtMzINCnRhYmxlX3N0dWZmJG1lYW5fZ292M1t0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj49MF0gPC0gIHRhYmxlX3N0dWZmJG1lYW5fZ292M1t0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj49MF0gIC0zMA0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjNbdGFibGVfc3R1ZmYkbWVhbl9nb3YzPjEwMF0gPC0gTkENCnRhYmxlKHRhYmxlX3N0dWZmJG1lYW5fZ292MykNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y0W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTVdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292NFt0YWJsZV9zdHVmZiR0ZXJyb3IyPT01XS01DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjRbdGFibGVfc3R1ZmYkdGVycm9yMj09NF0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y0W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTRdLTEwDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjRbdGFibGVfc3R1ZmYkdGVycm9yMj09M10gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y0W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTNdLTE1DQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292NFt0YWJsZV9zdHVmZiRtZWFuX2dvdjQ+MTAwXSA8LSBOQQ0KdGFibGUodGFibGVfc3R1ZmYkbWVhbl9nb3Y0KQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjVbdGFibGVfc3R1ZmYkdGVycm9yMj09NV0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y1W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTVdLTgNCnRhYmxlX3N0dWZmJG1lYW5fZ292NVt0YWJsZV9zdHVmZiR0ZXJyb3IyPT00XSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjVbdGFibGVfc3R1ZmYkdGVycm9yMj09NF0tMTYNCnRhYmxlX3N0dWZmJG1lYW5fZ292NVt0YWJsZV9zdHVmZiR0ZXJyb3IyPT0zXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjVbdGFibGVfc3R1ZmYkdGVycm9yMj09M10tMjQNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y1W3RhYmxlX3N0dWZmJG1lYW5fZ292NT4xMDBdIDwtIE5BDQp0YWJsZSh0YWJsZV9zdHVmZiRtZWFuX2dvdjUpDQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292Nlt0YWJsZV9zdHVmZiRkaXNjdXNzMj09Ml0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y2W3RhYmxlX3N0dWZmJGRpc2N1c3MyPT0yXSAtNQ0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y2W3RhYmxlX3N0dWZmJGRpc2N1c3MyPT0xXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjZbdGFibGVfc3R1ZmYkZGlzY3VzczI9PTFdIC0xMA0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjZbdGFibGVfc3R1ZmYkbWVhbl9nb3Y2PjEwMF0gPC0gTkENCnRhYmxlKHRhYmxlX3N0dWZmJG1lYW5fZ292NikNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y3W3RhYmxlX3N0dWZmJGRpc2N1c3MyPT0yXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjdbdGFibGVfc3R1ZmYkZGlzY3VzczI9PTJdIC0xMA0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y3W3RhYmxlX3N0dWZmJGRpc2N1c3MyPT0xXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjdbdGFibGVfc3R1ZmYkZGlzY3VzczI9PTFdIC0yMA0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjdbdGFibGVfc3R1ZmYkbWVhbl9nb3Y3PjEwMF0gPC0gTkENCnRhYmxlKHRhYmxlX3N0dWZmJG1lYW5fZ292NykNCg0KDQpsb2FkKHFvZ191cmwpDQoNCnFvZzEwIDwtIHN1YnNldChxb2cscW9nJHllYXI9PTIwMDAgfA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMDEgfCAgDQogICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAwMiB8IA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMDMgfCANCiAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDA0IHwgDQogICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAwNSB8IA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMDYgfCANCiAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDA3IHwgDQogICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAwOCB8IA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMDkgfA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMTApDQoNCmxpYnJhcnkoY291bnRyeWNvZGUpDQpxb2cxMCRjbnRyeTwtY291bnRyeWNvZGUocW9nMTAkY2NvZGVjb3csICJjb3duIiwiY291bnRyeS5uYW1lLmVuIikNCnFvZzEwJGFsX2V0aG5pYzwtYXMubnVtZXJpYyhxb2cxMCRhbF9ldGhuaWMpDQojdGlkeXI6OmdhdGhlcihxb2cxMCxjKCJjbnRyeSIsInllYXIiKSwiYWxfZXRobmljIikNCg0KcW9nMTBhIDwtIHFvZzEwICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsYWxfZXRobmljKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpDQpkYXRhX3dpZGUxNyA8LSByZXNoYXBlKGRhdGEgPSBxb2cxMGEsDQogICAgICAgICAgICAgICAgICAgICAgIGlkdmFyID0gImNudHJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lcyA9ICJhbF9ldGhuaWMiLA0KICAgICAgICAgICAgICAgICAgICAgICB0aW1ldmFyID0gInllYXIiLA0KICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAid2lkZSIpDQoNCiNxb2cxMGhkaSA8LSBxb2cxMCAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSx5ZWFyLHVuZHBfaGRpKSAlPiUNCiMgIGFzLmRhdGEuZnJhbWUoKQ0KI2RhdGFfd2lkZV9oZGkgPC0gaGRpDQogICNyZXNoYXBlKGRhdGEgPSBxb2cxMGhkaSwNCiAgICAgICAgICAgICAgICAgICAgICAjIGlkdmFyID0gImNudHJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAjIHYubmFtZXMgPSAidW5kcF9oZGkiLA0KICAgICAgICAgICAgICAgICAgICAgICMgdGltZXZhciA9ICJ5ZWFyIiwNCiAgICAgICAgICAgICAgICAgICAgICAjIGRpcmVjdGlvbiA9ICJ3aWRlIikNCg0KDQoNCnRhYmxlKHFvZyRhbF9ldGhuaWMscW9nJHllYXIpDQoNCnFvZzE0IDwtIHN1YnNldChxb2cscW9nJHllYXI9PTIwMTQpDQpxb2cxNCRjbnRyeTwtY291bnRyeWNvZGUocW9nMTQkY2NvZGVjb3csICJjb3duIiwiY291bnRyeS5uYW1lLmVuIikNCnFvZzE0IDwtIHFvZzE0ICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsY3NwZl9sZWdpdCkgJT4lDQogIGFzLmRhdGEuZnJhbWUoKQ0KZGF0YV93aWRlMTggPC0gcmVzaGFwZShkYXRhID0gcW9nMTQsDQogICAgICAgICAgICAgICAgICAgICAgIGlkdmFyID0gImNudHJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lcyA9ICJjc3BmX2xlZ2l0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgdGltZXZhciA9ICJ5ZWFyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gIndpZGUiKQ0KDQpxb2cxNSA8LSBzdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDE1KQ0KcW9nMTUkY250cnk8LWNvdW50cnljb2RlKHFvZzE1JGNjb2RlY293LCAiY293biIsImNvdW50cnkubmFtZS5lbiIpDQpxb2cxNSA8LSBxb2cxNSAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSx5ZWFyLGZmcF9zbCkgJT4lDQogIGFzLmRhdGEuZnJhbWUoKQ0KZGF0YV93aWRlMTkgPC0gcmVzaGFwZShkYXRhID0gcW9nMTUsDQogICAgICAgICAgICAgICAgICAgICAgIGlkdmFyID0gImNudHJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lcyA9ICJmZnBfc2wiLA0KICAgICAgICAgICAgICAgICAgICAgICB0aW1ldmFyID0gInllYXIiLA0KICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAid2lkZSIpDQoNCg0KcW9nMTAkY2lyaV9waHlzaW50PC1hcy5udW1lcmljKHFvZzEwJGNpcmlfcGh5c2ludCkNCnFvZzEwYSA8LSBxb2cxMCAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSx5ZWFyLGNpcmlfcGh5c2ludCkgJT4lDQogIGFzLmRhdGEuZnJhbWUoKQ0KZGF0YV93aWRlMjAgPC0gcmVzaGFwZShkYXRhID0gcW9nMTBhLA0KICAgICAgICAgICAgICAgICAgICAgICBpZHZhciA9ICJjbnRyeSIsDQogICAgICAgICAgICAgICAgICAgICAgIHYubmFtZXMgPSAiY2lyaV9waHlzaW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgdGltZXZhciA9ICJ5ZWFyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gIndpZGUiKQ0KDQpxb2cxMCRnZF9wdHNzIDwtYXMubnVtZXJpYyhxb2cxMCRnZF9wdHNzKQ0KcW9nMTBhIDwtIHFvZzEwICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsZ2RfcHRzcykgJT4lDQogIGFzLmRhdGEuZnJhbWUoKQ0KZGF0YV93aWRlMjEgPC0gcmVzaGFwZShkYXRhID0gcW9nMTBhLA0KICAgICAgICAgICAgICAgICAgICAgICBpZHZhciA9ICJjbnRyeSIsDQogICAgICAgICAgICAgICAgICAgICAgIHYubmFtZXMgPSAiZ2RfcHRzcyIsDQogICAgICAgICAgICAgICAgICAgICAgIHRpbWV2YXIgPSAieWVhciIsDQogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJ3aWRlIikNCg0KcW9nMTQ8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMTQpDQpxb2cxMzwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAxMykNCnFvZzEyPC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDEyKQ0KcW9nMTE8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMTEpDQpxb2cxMDwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAxMCkNCnFvZzg8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMDgpDQpxb2c3PC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDA3KQ0KcW9nNjwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAwNikNCnFvZzU8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMDUpDQpxb2c0PC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDA0KQ0KcW9nMzwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAwMykNCnFvZzI8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMDIpDQpxb2cxPC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDAxKQ0KcW9nMDwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAwMCkNCg0KDQoNCnRhYmxlKGlzLm5hKHFvZyR3ZWxfY3VsdHVyZSkscW9nJHllYXIpDQpjdWxyZWc8LSBwbWF4KHFvZzE0JHdlbF9jdWx0dXJlLCBxb2cxMyR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzEyJHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nMTEkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2cxMCR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzgkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2c3JHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nNiR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzUkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2c0JHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nMyR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzIkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2cxJHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nMCR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gYXMuY2hhcmFjdGVyKHNqbWlzYzo6dG9fbGFiZWwoY3VscmVnKSkNCmN1bHJlZzwtYXMuZGF0YS5mcmFtZShjYmluZChjdWxyZWcscW9nMTQkY2NvZGVjb3cpKQ0Kb3JlYXN0ICA8LSBzdWJzZXQoY3VscmVnLCBjdWxyZWckY3VscmVnID09ICJPcnRob2RveCBFYXN0IikNCm9yZWFzdA0KDQojY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzEwJHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQoNCnFvZzE0JGh0X3JlZ2lvbiANCg0KY3VscmVnJGNudHJ5PC1jb3VudHJ5Y29kZShjdWxyZWckVjIsICJjb3duIiwiY291bnRyeS5uYW1lLmVuIikNCnRhYmVsZXR0bzwtbWVyZ2UodGFibGVfc3R1ZmYsY3VscmVnLGJ5PSJjbnRyeSIpDQp0YWJlbGV0dG88LWFzLmRhdGEuZnJhbWUoY2JpbmQodGFibGVfc3R1ZmYkcmVnaW9ucywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIodGFibGVfc3R1ZmYkY250cnkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih0YWJlbGV0dG8kY3VscmVnKSkpDQp0YWJlbGV0dG8gPC0gdGFiZWxldHRvW29yZGVyKHRhYmVsZXR0byRWMSwgdGFiZWxldHRvJFYzKSxdDQojZWRpdCh0YWJlbGV0dG8pDQoNCmN1bHJlZzwtZGF0YS5mcmFtZShjYmluZCh0YWJlbGV0dG8sY3VscmVnKSkNCmN1bHJlZzwtY3VscmVnWyxjKDIsNCldDQpuYW1lcyhjdWxyZWcpWzFdPC1jKCJjbnRyeSIpDQoNCnRhYmxlX3N0dWZmMyA8LSBtZXJnZSh0YWJsZV9zdHVmZixjdWxyZWcsYnk9ImNudHJ5IikNCg0KdGFibGUoYXMuY2hhcmFjdGVyKHRhYmVsZXR0byRWMykpDQoNCnFvZzEwMCA8LSBzdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDEwKQ0KcW9nMTAwJGNudHJ5PC1jb3VudHJ5Y29kZShzam1pc2M6OnRvX2xhYmVsKHFvZzEwMCRjY29kZWNvdyksICJjb3duIiwiY291bnRyeS5uYW1lLmVuIikNCnFvZzEwMCA8LSBxb2cxMDAgJT4lIGRwbHlyOjpzZWxlY3QoY250cnkseWVhcixodF9yZWd0eXBlMSkgJT4lDQogIGFzLmRhdGEuZnJhbWUoKQ0KcW9nMTAwJHJlZ3R5cGU8LXNqbWlzYzo6dG9fbGFiZWwocW9nMTAwJGh0X3JlZ3R5cGUxKQ0KcW9nMTAwJHllYXIgPC0gTlVMTA0KcW9nMTAwJGh0X3JlZ3R5cGUxIDwtIE5VTEwNCnRhYmxlKHFvZzEwMCRyZWd0eXBlKQ0KDQoNCmV0aG5pYzEwPC1hcy5udW1lcmljKHJvd01lYW5zKGRhdGFfd2lkZTE3WywyOjEyXSkpICMgbWVhbiBvdmVyIGxhc3QgMTAgeWVhcnMgKDIwMDAgLSAyMDEwKQ0KcGh5c2ludDEwPC1hcy5udW1lcmljKHJvd01lYW5zKGRhdGFfd2lkZTIwWywyOjEyXSkpICMgbWVhbiBvdmVyIGxhc3QgMTAgeWVhcnMgKDIwMDAgLSAyMDEwKQ0KdGVycm9yMTA8LWFzLm51bWVyaWMocm93TWVhbnMoZGF0YV93aWRlMjFbLDI6MTJdKSkgIyBtZWFuIG92ZXIgbGFzdCAxMCB5ZWFycyAoMjAwMCAtIDIwMTApDQpsZWdpdDwtYXMubnVtZXJpYyhkYXRhX3dpZGUxOFssMl0pICMgbWVhbiBvdmVyIGxhc3QgMTAgeWVhcnMgKDIwMDAgLSAyMDEwKQ0KbGVnaXQyPC1hcy5udW1lcmljKGRhdGFfd2lkZTE5WywyXSkgIyBtZWFuIG92ZXIgbGFzdCAxMCB5ZWFycyAoMjAwMCAtIDIwMTApDQpxb2d0aGluZ3k8LWRhdGEuZnJhbWUoZGF0YV93aWRlMTlbLDFdLGV0aG5pYzEwLGxlZ2l0LGxlZ2l0MixwaHlzaW50MTAsdGVycm9yMTApDQpjb2xuYW1lcyhxb2d0aGluZ3kpWzFdPC1jKCJjbnRyeSIpDQpxb2d0aGluZ3k8LW1lcmdlKHg9cW9ndGhpbmd5LCB5PXFvZzEwMCwgYnk9ImNudHJ5IikNCg0KI3FvZ3RoaW5neTwtZGF0YS5mcmFtZShkYXRhX3dpZGUxN1ssMV0sZXRobmljMTApDQojY29sbmFtZXMocW9ndGhpbmd5KVsxXTwtYygiY250cnkiKQ0KI2NvbWJpbmVkIDwtIG1lcmdlKHg9cW9ndGhpbmd5LCB5PWNvbWJpbmVkLCBieT0iY250cnkiKQ0KDQoNCnFvZ19jcyA8LXJlYWRfc3BzcygiQzovVXNlcnMvRmF2b25lL0Rvd25sb2Fkcy9xb2dfc3RkX2NzX2phbjE3LnNhdiIpICNsb2FkaW5nIGRhdGFzZXQNCnFvZ19jcyRjbnRyeTwtY291bnRyeWNvZGUocW9nX2NzJGNjb2RlY293LCAiY293biIsImNvdW50cnkubmFtZS5lbiIpDQpxb2dfY3MkbGVnaXQzPC1hcy5udW1lcmljKHFvZ19jcyRnb3ZfaXhsZWdpdGltYWN5aW5kZXgpDQoNCmxlZ2l0X2RhdDwtZGF0YS5mcmFtZShxb2dfY3MkY250cnkscW9nX2NzJGxlZ2l0MykNCmNvbG5hbWVzKGxlZ2l0X2RhdCk8LWMoImNudHJ5IiwibGVnaXQzIikNCg0KYWdncmRlbGliIDwtIG1lcmdlKHg9bGVnaXRfZGF0LCB5PWFnZ3JkZWxpYiwgYnk9ImNudHJ5IikNCg0KYWdncmRlbGliJGxlZ2l0MyA8LSByYW5nZTAxKGFnZ3JkZWxpYiRsZWdpdDMpDQpjb3IobmEub21pdChhZ2dyZGVsaWJbLGMoNCw1LDcsMTMpXSkpDQpjb3IobmEub21pdChhZ2dyZGVsaWJbLGMoNCw1LDIsNjoxMyldKSkNCg0KYWdncmRlbGliJGxlZ2l0IDwtIDEtcmFuZ2UwMShhZ2dyZGVsaWIkbGVnaXQpDQphZ2dyZGVsaWIkbGVnaXQyIDwtIDEtcmFuZ2UwMShhZ2dyZGVsaWIkbGVnaXQyKQ0KYWdncmRlbGliJGFzaWEgPC0gYWdncmRlbGliJGUuYXNpYSArIGFnZ3JkZWxpYiRzLmUuYXNpYSArIGFnZ3JkZWxpYiRzLmFzaWEgKyBhZ2dyZGVsaWIkcGFjaWZpYw0KDQpTRkkgPC1yZWFkX3Nwc3MoIkM6L1VzZXJzL0Zhdm9uZS9Eb3dubG9hZHMvU0ZJdjIwMTYuc2F2IikgI2xvYWRpbmcgZGF0YXNldA0KU0ZJIDwtIHN1YnNldChTRkksU0ZJJHllYXI9PTIwMTUpDQpTRkkkY250cnkgPC1jb3VudHJ5Y29kZShTRkkkY291bnRyeSwgImNvdW50cnkubmFtZS5lbiIsImNvdW50cnkubmFtZS5lbiIpIA0KU0ZJJGNudHJ5Wzc5XSA8LSAiTm9ydGggS29yZWEiDQpTRkkkY250cnkgPC1jb3VudHJ5Y29kZShTRkkkY250cnksICJjb3VudHJ5Lm5hbWUuZW4iLCJjb3VudHJ5Lm5hbWUuZW4iKSANClNGSSRsZWdpdGltYWN5IDwtIFNGSSRsZWdpdA0KU0ZJJGxlZ2l0IDwtIE5VTEwNCg0KDQphZ2dyZGVsaWIgPC0gbWVyZ2UoeD1TRkksIHk9YWdncmRlbGliLCBieT0iY250cnkiKQ0KDQpoZGkgPC0gcmVhZF9jc3YoImhkaS5jc3YiKQ0KaGRpJGNudHJ5PC1jb3VudHJ5Y29kZShoZGkkQ291bnRyeSwgImNvdW50cnkubmFtZS5lbiIsImNvdW50cnkubmFtZS5lbiIpDQpoZGkkJzE5OTAnPC0gTlVMTCA7IGhkaSQnMTk5MSc8LSBOVUxMIDsgaGRpJCcxOTkyJzwtIE5VTEwgOyBoZGkkJzE5OTMnPC0gTlVMTA0KaGRpJCcxOTk0JzwtIE5VTEw7IGhkaSQnMTk5NSc8LSBOVUxMOyBoZGkkJzE5OTYnPC0gTlVMTDsgaGRpJCcxOTk3JzwtIE5VTEwNCmhkaSQnMTk5OCc8LSBOVUxMIDsgaGRpJCcxOTk5JzwtIE5VTEwgOyBoZGkkJzIwMTEnPC0gTlVMTCA7IGhkaSQnMjAxMic8LSBOVUxMDQpoZGkkJzIwMTMnPC0gTlVMTDsgaGRpJCcyMDE0JzwtIE5VTEw7IGhkaSQnMjAxNSc8LSBOVUxMO2hkaSRgSERJIFJhbmsgKDIwMTUpYDwtIE5VTEwNCmhkaSRDb3VudHJ5PC0gTlVMTA0KaGRpMTA8LWFzLm51bWVyaWMocm93TWVhbnMoaGRpWywxOjExXSkpIA0KaGRhdDwtZGF0YS5mcmFtZShoZGkkY250cnksaGRpMTApIA0KbmFtZXMoaGRhdCk8LWMoImNudHJ5IiwiaGRpMTAiKQ0KDQphZ2dyZGVsaWIgPC0gbWVyZ2UoeD1oZGF0LCB5PWFnZ3JkZWxpYiwgYnk9ImNudHJ5IikNCiN0YWJsZShhZ2dyZGVsaWIkaGRpMTApDQojZ2MoKQ0KI2NvbWJpbmVkIDwtIG1lcmdlKHg9aGRhdCwgeT1jb21iaW5lZCwgYnk9ImNudHJ5IikNCg0KDQojY29sbmFtZXMoYWdncmRlbGliKVs5XTwtImVfcF9wb2xpdHkiDQojbG9wPC1zdWJzZXQodmRlbXNfc3RhcnQsdmRlbXNfc3RhcnQkeWVhcj09MjAxMCkNCg0KY29yKG5hLm9taXQoYWdncmRlbGliMlssMjoxN10pKQ0KY29yKG5hLm9taXQoZGF0YS5mcmFtZShhZ2dyZGVsaWIkcG9saXR5MTAsYWdncmRlbGliJGRlbGliMTApKSkNCg0KI2hpc3QodmRlbXMkdjJkbGNvbnNsdCkNCiNoaXN0KHZkZW1zJHYyeGNsX2Rpc2MpDQojdGFibGUodmRlbXNfc3RhcnQkZV9ib2l4X3JlZ2ltZSx2ZGVtc19zdGFydCR5ZWFyKQ0KI3RhYmxlKHZkZW1zX3N1YiRlX3BfcG9saXR5LHZkZW1zX3N1YiR5ZWFyKQ0KDQojIyMjIyBtZXJnaW5nIHRpbWUgIyMjIw0KDQpjb21iaW5lZCA8LSBtZXJnZSh4PW1lcmdlZCwgeT1hZ2dyZGVsaWIsIGJ5PSJjbnRyeSIpDQp0YWJsZShjb21iaW5lZCRjbnRyeSkNCg0KY29tYmluZWQgPC0gYXMuZGF0YS5mcmFtZShjb21iaW5lZCkNCmNvbWJpbmVkJGdvdl90cnVzdCA8LSBhcy5udW1lcmljKGNvbWJpbmVkJGdvdl90cnVzdCkNCmNvbWJpbmVkJGFnZSA8LSBhcy5udW1lcmljKGNvbWJpbmVkJGFnZSkNCmNvbWJpbmVkJGluY29tZSA8LSBhcy5udW1lcmljKGNvbWJpbmVkJGluY29tZSkNCmNvbWJpbmVkJGVkdWMgPC0gYXMubnVtZXJpYyhjb21iaW5lZCRlZHVjKQ0KY29tYmluZWQkc2V4IDwtIGFzLmZhY3Rvcihjb21iaW5lZCRzZXgpDQpjb21iaW5lZCRhdXRob3JpdGFyaWFuIDwtIGFzLm51bWVyaWMoY29tYmluZWQkYXV0aG9yaXRhcmlhbikNCmNvbWJpbmVkJHNhZmV0eSA8LSBhcy5udW1lcmljKGNvbWJpbmVkJHNhZmV0eSkNCmNvbWJpbmVkJGRlbXRvZGF5IDwtIGFzLm51bWVyaWMoY29tYmluZWQkZGVtdG9kYXkpDQpjb21iaW5lZCRsYXRpbm8gPC0gZmFjdG9yKGNvbWJpbmVkJGxhdGlubykNCmNvbWJpbmVkJGFmcm8gPC0gZmFjdG9yKGNvbWJpbmVkJGFmcm8pDQpjb21iaW5lZCRhbWVyaWNhcyA8LSBmYWN0b3IoY29tYmluZWQkYW1lcmljYXMpDQpjb21iaW5lZCRhc2lhIDwtIGNvbWJpbmVkJGUuYXNpYSArIGNvbWJpbmVkJHMuZS5hc2lhICsgY29tYmluZWQkcy5hc2lhICsgY29tYmluZWQkcGFjaWZpYw0KDQpjb3IobmEub21pdChkYXRhLmZyYW1lKGNvbWJpbmVkJGdvdl90cnVzdCxjb21iaW5lZCRpbmNvbWUsY29tYmluZWQkZWR1YywgI1NvY2lvZWNvbm9taWMgZmFjdG9ycw0KICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZCRkZWxpYjEwLCBjb21iaW5lZCRwb2xpdHkxMCwgY29tYmluZWQkZ2RwMTAsIGNvbWJpbmVkJGRlbXRvZGF5KSkpDQoNCmNvbWJpbmVkJGNudHJ5PC1hcy5mYWN0b3IoY29tYmluZWQkY250cnkpDQoNCg0KI2NvbWJpbmVkJHBvbGl0eTEwIDwtIGNvbWJpbmVkJHBvbGl0eTEwKjIwLTEwDQoNCiNjb21iaW5lZCRyZWdpbWUgPC0gY29tYmluZWQkcG9saXR5MTANCiNjb21iaW5lZCRyZWdpbWVbY29tYmluZWQkcG9saXR5X2F1dG9kdW1teT09MV0gPC0gImF1dG8iDQojY29tYmluZWQkcmVnaW1lW2NvbWJpbmVkJHBvbGl0eV9hbm9kdW1teT09MV0gPC0gImFubyINCiNjb21iaW5lZCRyZWdpbWVbY29tYmluZWQkcG9saXR5X2RlbWR1bW15PT0xXSA8LSAiZGVtbyINCg0KaGlzdChjb21iaW5lZCRnb3ZfdHJ1c3QpDQpxcGxvdChjb21iaW5lZCRnb3ZfdHJ1c3QpDQoNCmNvbWJpbmVkJGNudHJ5DQoNCg0KDQojcGh5c2lfcyA8LSB2ZGVtc19zdWIyICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5ZWFycywgZnJhbnopDQoNCiNjb21iaW5lZCA8LSBtZXJnZShjb21iaW5lZCwgcGh5c2lfcywgYnkgPSAiY250cnllYXJzIikNCg0KI3BoeXNpMl9zIDwtIGRkcGx5KGNvbWJpbmVkLH5jbnRyeSwNCiMgICAgICAgICAgICAgICAgc3VtbWFyaXNlLHBvbGl0Y2F0PW1lYW4oZnJhbnosbmEucm09VCkpDQoNCiNjb21iaW5lZCA8LSBtZXJnZShjb21iaW5lZCwgcGh5c2kyX3MsIGJ5ID0gImNudHJ5IikNCg0KDQp2ZGVtc19zdWIyJGNudHJ5ZWFycyA8LSBwYXN0ZSh2ZGVtc19zdWIyJGNudHJ5LHZkZW1zX3N1YjIkeWVhcikNCg0KcGh5c2kgPC0gdmRlbXNfc3ViMiAlPiUgZHBseXI6OnNlbGVjdChjbnRyeWVhcnMsIHBlcmMpDQoNCmNvbWJpbmVkIDwtIG1lcmdlKGNvbWJpbmVkLCBwaHlzaSwgYnkgPSAiY250cnllYXJzIikNCg0KcGh5c2kyIDwtIGRkcGx5KGNvbWJpbmVkLH5jbnRyeSwNCiAgICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZSxwaHlzdmlvbD1tZWFuKHBlcmMsbmEucm09VCkpDQoNCmNvbWJpbmVkIDwtIG1lcmdlKGNvbWJpbmVkLCBwaHlzaTIsIGJ5ID0gImNudHJ5IikNCg0KDQoNCg0KDQojcGh5c2lfMjIkZGlzMyA8LXJvdW5kKHBoeXNpXzIyJGRpczIpDQoNCiN1bmlxdWUocGh5c2kyX3MkY250cnkpDQoNCiMxLTIuNQ0KIzMtNQ0KIzUuNSAtIDcNCiNwaHlzaTJfcyRwb2xpdGNhdDI8LTgtKChwaHlzaTJfcyRwb2xpdGNhdCkgKiAoNy8xMCkpDQojMTEgDQoNCiNwaHlzaTJfcyRwb2xpdHlfZGVtZHVtbXkgPC0gcGh5c2kyX3MkcG9saXRjYXQyDQojcGh5c2kyX3MkcG9saXR5X2RlbWR1bW15IFtwaHlzaTJfcyRwb2xpdGNhdDIgPD0gMi41XSA8LSAxDQojcGh5c2kyX3MkcG9saXR5X2RlbWR1bW15IFtwaHlzaTJfcyRwb2xpdGNhdDIgPiAgMi41XSA8LSAwDQojdGFibGUocGh5c2kyX3MkcG9saXR5X2RlbWR1bW15KQ0KDQojcGh5c2kyX3MkcG9saXR5X2Fub2R1bW15IDwtIHBoeXNpMl9zJHBvbGl0Y2F0Mg0KI3BoeXNpMl9zJHBvbGl0eV9hbm9kdW1teVtwaHlzaTJfcyRwb2xpdGNhdDIgPiAyLjUgJiBwaHlzaTJfcyRwb2xpdGNhdDIgPCA1LjVdIDwtIDENCiNwaHlzaTJfcyRwb2xpdHlfYW5vZHVtbXlbcGh5c2kyX3MkcG9saXRjYXQyIDw9IDIuNSB8IHBoeXNpMl9zJHBvbGl0Y2F0MiA+PSA1LjVdIDwtIDANCiN0YWJsZShwaHlzaTJfcyRwb2xpdHlfYW5vZHVtbXkpDQoNCiNwaHlzaTJfcyRwb2xpdHlfYXV0b2R1bW15IDwtIHBoeXNpMl9zJHBvbGl0Y2F0Mg0KI3BoeXNpMl9zJHBvbGl0eV9hdXRvZHVtbXlbcGh5c2kyX3MkcG9saXRjYXQyID49IDUuNV0gPC0gMQ0KI3BoeXNpMl9zJHBvbGl0eV9hdXRvZHVtbXlbcGh5c2kyX3MkcG9saXRjYXQyIDwgNS41XSA8LSAwDQojdGFibGUocGh5c2kyX3MkcG9saXR5X2F1dG9kdW1teSkNCg0KI3BoeXNpMl9zJHJlZ2ltZSA8LSBwaHlzaTJfcyRwb2xpdGNhdA0KI3BoeXNpMl9zJHJlZ2ltZVtwaHlzaTJfcyRwb2xpdHlfYXV0b2R1bW15PT0xXSA8LSAiYXV0byINCiNwaHlzaTJfcyRyZWdpbWVbcGh5c2kyX3MkcG9saXR5X2Fub2R1bW15PT0xXSA8LSAiYW5vIg0KI3BoeXNpMl9zJHJlZ2ltZVtwaHlzaTJfcyRwb2xpdHlfZGVtZHVtbXk9PTFdIDwtICJkZW1vIg0KDQojdW5pcXVlKHBoeXNpMl9zJGNudHJ5KQ0KDQp0YWJsZShwaHlzaTJfcyRyZWdpbWUpDQoNCnFvZzIwMDAgPC0gc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAxMCB8DQogICAgICAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDExIHwgIA0KICAgICAgICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAxMiB8IA0KICAgICAgICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAxMyB8IA0KICAgICAgICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAxNCB8IA0KICAgICAgICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAxNSkNCg0KdGFibGUocW9nMjAwMCRnZF9wdHNhLHFvZzIwMDAkeWVhcikNCg0KcW9nMjAwMCRwZXJjMiA8LSBxb2cyMDAwJGdkX3B0c2ENCg0KcW9nMjAwMCRjbnRyeTwtY291bnRyeWNvZGUocW9nMjAwMCRjY29kZWNvdywgImNvd24iLCJjb3VudHJ5Lm5hbWUuZW4iKQ0KDQpxb2cyMDAwJGNudHJ5ZWFycyA8LSBwYXN0ZShxb2cyMDAwJGNudHJ5LHFvZzIwMDAkeWVhcikNCg0KcGh5c2kyMDAwIDwtIHFvZzIwMDAgJT4lIGRwbHlyOjpzZWxlY3QoY250cnllYXJzLCBwZXJjMikNCg0KY29tYmluZWQgPC0gbWVyZ2UoY29tYmluZWQsIHBoeXNpMjAwMCwgYnkgPSAiY250cnllYXJzIikNCg0KcGh5c2kyMjAwMCA8LSBkZHBseShjb21iaW5lZCx+Y250cnksDQogICAgICAgICAgICAgICAgc3VtbWFyaXNlLHRlcnJvcj1tZWFuKHBlcmMyLG5hLnJtPVQpKQ0KDQpjb21iaW5lZCA8LSBtZXJnZShjb21iaW5lZCwgcGh5c2kyMjAwMCwgYnkgPSAiY250cnkiKQ0KDQojdGFibGUocW9nMjAwMCR1bmRwX2hkaSxxb2cyMDAwJHllYXIpDQoNCiNwaHlzaWZmIDwtIHFvZzIwMDAgJT4lIGRwbHlyOjpzZWxlY3QoY250cnllYXJzLCB1bmRwX2hkaSkNCg0KI2NvbWJpbmVkIDwtIG1lcmdlKGNvbWJpbmVkLCBwaHlzaWZmLCBieSA9ICJjbnRyeWVhcnMiKQ0KDQojcGh5c2lmZjIgPC0gZGRwbHkoY29tYmluZWQsfmNudHJ5LA0KIyAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlLGhkaT1tZWFuKHVuZHBfaGRpLG5hLnJtPVQpKQ0KDQojY29tYmluZWQgPC0gbWVyZ2UoY29tYmluZWQsIHBoeXNpZmYyLCBieSA9ICJjbnRyeSIpDQoNCg0KZ25pIDwtIHJlYWRfY3N2KCJHTkkuY3N2IiwgIHNraXAgPSAxKQ0KDQpnbmkkYDIwMTVgPC1nc3ViKCJ0dHQiLCIiLGduaSRgMjAxNWApDQpnbmkkYDIwMTVgPC1nc3ViKCJmZiIsIiIsZ25pJGAyMDE1YCkNCmduaSRgMjAxNWA8LWdzdWIoInNzcyIsIiIsZ25pJGAyMDE1YCkNCmduaSRgMjAxNWA8LWdzdWIoInV1dSIsIiIsZ25pJGAyMDE1YCkNCmduaSRgMjAxNWA8LWdzdWIoIm8iLCIiLGduaSRgMjAxNWApDQpnbmkkYDIwMTVgIDwtIGFzLm51bWVyaWMoZ25pJGAyMDE1YCkNCg0KZ25pJGAyMDE0YDwtZ3N1YigidHR0IiwiIixnbmkkYDIwMTRgKQ0KZ25pJGAyMDE0YDwtZ3N1YigiZmYiLCIiLGduaSRgMjAxNGApDQpnbmkkYDIwMTRgPC1nc3ViKCJzc3MiLCIiLGduaSRgMjAxNGApDQpnbmkkYDIwMTRgPC1nc3ViKCJ1dXUiLCIiLGduaSRgMjAxNGApDQpnbmkkYDIwMTRgPC1nc3ViKCJvIiwiIixnbmkkYDIwMTRgKQ0KZ25pJGAyMDE0YCA8LSBhcy5udW1lcmljKGduaSRgMjAxNGApDQoNCmduaTwtZ25pWyxjKDIsMjM6MjgpXQ0KDQpnbmk8LWdhdGhlcihhcy5kYXRhLmZyYW1lKGduaSksa2V5ID0gIkNvdW50cnkiKQ0KbmFtZXMoZ25pKSA8LSBjKCJjbnRyeSIsInllYXIiLCJnbmkiKQ0KDQpnbmkkY250cnk8LWNvdW50cnljb2RlKGduaSRjbnRyeSwiY291bnRyeS5uYW1lLmVuIiwiY291bnRyeS5uYW1lLmVuIikNCmduaSRjbnRyeWVhcnMgPC0gcGFzdGUoZ25pJGNudHJ5LGduaSR5ZWFyKQ0KDQpwaHlzaWduaSA8LSBnbmkgJT4lIGRwbHlyOjpzZWxlY3QoY250cnllYXJzLCBnbmkpDQoNCmNvbWJpbmVkIDwtIG1lcmdlKGNvbWJpbmVkLCBwaHlzaWduaSwgYnkgPSAiY250cnllYXJzIikNCg0KcGh5c2lnbmkyIDwtIGRkcGx5KGNvbWJpbmVkLH5jbnRyeSwNCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlLGduaV9jPW1lYW4oZ25pLG5hLnJtPVQpKQ0KDQpjb21iaW5lZCA8LSBtZXJnZShjb21iaW5lZCwgcGh5c2lnbmkyLCBieSA9ICJjbnRyeSIpDQoNCg0KDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K